Pergunta sobre .net, c#, regex – Usando regex para extrair vários números de seqüências de caracteres

7

Eu tenho uma string com dois ou mais números. Aqui estão alguns exemplos:

"(1920x1080)"
" 1920 by 1080"
"16 : 9"

Como posso extrairseparado números como "1920" e "1080", assumindo que eles serão separados por um ou mais caracteres não-numéricos?

Por favor, decida em qual idioma você precisa da resposta. Os objetos regex no .NET não são os mesmos que os do Java. Oded
@Oded ok, feito. David

Sua resposta

5   a resposta
1

você pode usar

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"};
foreach (var item in input)
{
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray();
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]);
}

SAÍDA:

1920,1080
1920,1080
16,9
Sim, atualizado, obrigado @David Damith
bom, mas geralmente retorna cadeias extras vazias. David
5

Você pode pegar a string seguindo

MatchCollection v = Regex.Matches(input, "[0-9]+");
foreach (Match s in v)
            {
                // output is s.Value
            }
Normalmente eu pratico com RegexOptions.IgnoreCase. Desculpa pelo engano Md Kamruzzaman Sarker
RegexOptions.IgnoreCase Não é necessário. Algarismos romanos não têm casos superiores / inferiores. Oded
Não é um erro como tal. Apenas não é necessário neste caso. Oded
1
(\d+)\D+(\d+)

personalize esse regex para corresponder ao sabor do idioma que você usará.

Se o caractere for definido como um dígito Unicode, ele será correspondido no .NET por\d. Oded
@Rawling - Sim, eles são. Mal colocado por mim mesmo. Significa os dígitos normalmente usados ​​no oeste, em comparação com outros scripts. Oded
Você poderia explicar a vantagem disso sobre o Regex.Matches (s, "[0-9] +") ;? David
Regex do .net / C # (e do PCRE)\d corresponde a [0-9]. Período. dda
10

A expressão regular básica seria:

[0-9]+

Você precisará usar a biblioteca para analisar todas as correspondências e obter seus valores.

var matches = Regex.Matches(myString, "[0-9]+");

foreach(var march in matches)
{
   // match.Value will contain one of the matches
}
0

todas as respostas acima consideram 12i ou a2 números válidos quando não deveriam.

O seguinte poderia resolver este problema

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)");

Mas esta solução adiciona mais um problema :) Isso irá capturar os espaços em torno do inteiro. Para resolver isso, precisamos capturar o valor do inteiro em um grupo:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)");
HashSet<string> uniqueNumbers = new HashSet<string>();
foreach (Match m in matches)
{
    uniqueNumbers.Add(m.Groups[1].Value);
}

Perguntas relacionadas