2012-05-31 20 views
7

Tengo una cadena con dos o más números. Aquí están algunos ejemplos:Uso de expresiones regulares para extraer múltiples números de las cadenas

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

¿Cómo puedo extraer números distintos como "1920" y "1080" de ella, asumiendo que se acaba de estar separados por uno o más no numérico personaje (s)?

+0

Por favor, decida qué idioma que necesita la respuesta en los objetos de expresiones regulares en .NET no son los mismos que los de Java.. – Oded

+0

@Oded ok, hecho. – David

Respuesta

9

La expresión regular básica sería:

[0-9]+ 

Usted tendrá que utilizar la biblioteca para repasar todos los partidos y obtener sus valores.

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

foreach(var march in matches) 
{ 
    // match.Value will contain one of the matches 
} 
1
(\d+)\D+(\d+) 

Después de eso, personalice esta expresión regular para que coincida con el sabor del idioma que utilizará.

+0

'\ d' contendrá _todos_ dígitos, no solo números romanos, según la biblioteca de expresiones regulares y la plataforma. – Oded

+0

.net/C# (y PCRE's) regex '\ d' matches [0-9]. Período. – dda

+0

No, no es así. Coincidirá en- http://stackoverflow.com/a/6479605/1583 – Oded

1

puede utilizar

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]); 
} 

SALIDA:

1920,1080 
1920,1080 
16,9 
+0

bien, pero a menudo devuelve cadenas adicionales vacías. – David

+0

Sí, actualizado, Gracias @David – Damith

5

Puede obtener la cadena siguiendo

MatchCollection v = Regex.Matches(input, "[0-9]+"); 
foreach (Match s in v) 
      { 
       // output is s.Value 
      } 
+0

'RegexOptions.IgnoreCase' no es necesario. Los números romanos no tienen mayúsculas/minúsculas. – Oded

+0

Normalmente practico con RegexOptions.IgnoreCase. Perdón por error –

+0

No es un error como tal. Simplemente no es necesario en este caso. – Oded

0

Todavía hay un problema, sin embargo, todas las respuestas anteriores considere 12i o a2 números válidos cuando sh no debería.

El siguiente podría resolver este problema

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

Pero esta solución añade un problema más :) Esto captura los espacios alrededor del número entero. Para solucionar esto, necesitamos capturar el valor del entero en un 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); 
} 
Cuestiones relacionadas