2010-07-19 7 views
7

Necesito hacer coincidir 8 o más dígitos, cuya secuencia puede incluir espacios.Ignorando el espacio en blanco para una coincidencia Regex

por ejemplo, todas las siguientes serían equivalencias válidas.

12345678 
1 2345678 
12 3 45678 
1234 5678 
12 34567 8 
1 2 3 4 5 6 7 8 

En el momento en que tienen \d{8,} pero esto sólo capturar un bloque sólido de 8 o más dígitos.
[\d\s]{8,} no funcionará ya que no quiero que el espacio en blanco contribuya al recuento de caracteres capturados.

Respuesta

1

Waayy más tarde, pero esto realmente necesita la respuesta correcta y una razón por la cual. ¿Quién sabía que esta pregunta podría tener una respuesta tan compleja, verdad? Lol. Pero hay muchas consideraciones sobre el espaciado en expresiones regulares.

En primer lugar; Nunca ponga un espacio en una expresión regular. Hacerlo hará que tu expresión regular sea ilegible e imposible de mantener. Me viene a la memoria el uso de un mouse para resaltar un espacio para asegurar que sea solo un espacio. Esto romperá su expresión regular:    , pero esto no: [   ], porque se ignora la repetición en una clase de caracteres. Y si necesita una cantidad exacta de espacios, en realidad puede ver eso en una clase de personaje como esta: [ ]{3}. En comparación con los accidentes sin la clase de personaje, así:     {3} < - ¡Esto está buscando 5 espacios, woops!

Segundo; Mantenga la opción Freespacing (?x) en mente, lo que hace que su expresión regular sea commentable y de espacio libre. No debe temer que alguien que use esa opción pueda romper su expresión regular porque decidió poner espacios de teclado aleatorios en ella. Además, (?x) será no ignorar el espacio del teclado cuando está dentro de una clase de caracteres como lo es: [ ]. Por lo tanto, es más seguro usar clases de caracteres para los espacios del teclado.

Tercero; Intente no usar \s en este escenario. Como señala Omaghosh, también incluye líneas nuevas (\r y \n). El escenario que mencionaste no parece favorecer eso. Sin embargo, también como señala Omaghosh, es posible que desee algo más que espacios en el teclado. De modo que puede usar [ ], [\s-[\r\n]] o [\f\t\v\u00A0\u2028\u2029\u0020] dependiendo de lo que desee. Los dos últimos en esas opciones son la misma cosa, pero la resta de clase de caracteres solo funciona en .NET y un par de otros sabores extraños.

Cuarto; Este es un patrón comúnmente sobreconstruido: (\s*...\s*)*.No tiene ningún sentido. Es lo mismo que esto: (\s*\s*...)* o esto: (\s*\s*\s*\s*...)*. Porque el patrón se repite. El único argumento en contra de lo que estoy diciendo es que se garantizará que capture los espacios antes del .... Pero ni una sola vez es eso realmente deseado. peor de los casos, es posible que vea esto: \s*(...\s*)*

Omaghosh tenía la respuesta más cercana, pero esta es la respuesta correcta más corto:

Regex.Match(input, @"(?:\d[ ]*){8,}").Groups[0].Value; 

O lo siguiente, si tomamos la cuestión, literalmente, que los seis opciones se encuentran en el mismo texto en varias líneas:

Regex.Match(input, @"(?m)^(?:\d[ ]*){8,}$").Groups[0].Value; 

o en la siguiente, si es parte de una expresión regular más grande y necesita un grupo:

Regex.Match(input, @"...((?:\d[ ]*){8,})...").Groups[1].Value; 

Y no dude en reemplazar la [ ] con una clase Resta .NET, o una clase explícita Non-.NET espacios en blanco:

@"(?:\d[\s-[\r\n]]*){8,}" 
// Or . . . 
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}" 
+0

¡Excelente respuesta! –

0
(\d{8,}\s+)*\d{8,} 

debería funcionar

+0

Prueba esto en Expressio, que sólo coincide con '12345678' y ninguno de los otros ejemplos. –

+0

@Greg B: Veo a qué te refieres. No estaba seguro. Para ser honesto, no creo que sea posible en la expresión regular 'vainilla', pero estoy seguro de que hay un truco para manejarlo. Otra opción es quitar todos los espacios en blanco antes de aplicar Regex. – leppie

13
(\d *){8,} 

Coincide con ocho o más ocurrencias de un dígito seguido de cero o más espacios. Cámbielo a

(*\d *){8,} #there is a space before first asterik 

para que coincida con las cadenas con espacios al principio. O

(\s*\d\s*){8,} 

para unir las pestañas y otros espacios en blanco (que también incluyen líneas nuevas).

Finalmente, conviértalo en un grupo no capturable con ?:. Por lo tanto, se convierte en (?:\s*\d\s*){8,}

+0

1: No está mal :) (texto de relleno) – leppie

+1

1 '\ s * \ d \ s * {8} '' es en realidad (\ s * \ d \ s *) {8} ' – TheVillageIdiot

+0

@TheVillateIdiot Corregido ya :) – Amarghosh

Cuestiones relacionadas