2011-03-28 23 views

Respuesta

5

Estás en el camino correcto, lo que estás buscando es probablemente:

(\d[\s-]*){8,22}\d 
  • un dígito
  • seguido de cualquier número de espacios en blanco/tablero
  • 8-22 veces
  • seguido del último dígito
+0

@Bryan: ¿Cómo? '123-' tiene solo cuatro caracteres, por lo que no coincidirá con la condición '{9-23}'. – CanSpice

+0

que coincidirá con '123456789-', que no es algo que deba coincidir (si entiendo el problema correctamente) –

+0

@CanSpice: Me di cuenta de mi error poco después de que lo escribí. Tiene razón en que "123-" no coincidirá, pero "123456789-" coincidirá. –

0

Vamos a probar esto:

([0-9][ -]*){9,23} 

Esta expresión regular es demasiado corto de una respuesta así que aquí está mi favorito

+0

que coincidirá con '123456789-', que no es algo que debe coincidir (si entiendo el problema correctamente) –

2

Parece que no desea para que coincida con espacios iniciales o finales y rayas, por lo que el patrón que creo que va a trabajar es:

^\d([- ]*\d){8,22}$ 

es decir: un dígito, seguido de entre 8 y 22 grupos de cero o más guiones o espacios seguido de un único digi t.

Otra solución que puede ser más obvia es esta solución en dos etapas:

  1. partido contra \ d [- \ d] + \ d para asegurarse de que tiene una cadena de dígitos, espacios y guiones que tanto comienza y termina con al menos un dígito
  2. tira a cabo sólo los dígitos y contar cuántas tiene
0

Por lo que vale la pena, podría considerar dividir en dos pasos. En C#, por ejemplo, podrías hacer algo como esto.

Regex.Match(Regex.Replace(str, "[ -]", ""), @"^\d{9,23}") 

Se trata de dos operaciones de cadena, por lo que puede haber una penalización en el rendimiento si eso es importante para usted. Pero puede ser más legible para el próximo tipo.

Cuestiones relacionadas