2009-03-24 9 views
13

Necesito una expresión regular que coincida con un patrón o que esté vacía.¿Qué expresión regular coincidirá con un patrón o estará vacía?

Ahora mismo tienen una expresión ...

"\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x" 

... que coincide con los Estados Unidos números de teléfono. Sin embargo, es válido para la cadena que estoy probando que está vacía. Si la cadena tiene algún valor, debe coincidir con la expresión.

Tengo otros patrones que coinciden con los códigos postales de EE. UU., Etc. que necesitan el mismo condicional.

¿Cuál es la mejor manera de lograr esto en la misma expresión?

Aclaración: Estoy usando el RegexValidator en el Bloque de aplicaciones de validación de Microsoft. Un ejemplo de uso de esto es el siguiente:

[StringLengthValidator(0, 100, MessageTemplate = "Email must be between {3} and {5}")] 
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "Valid Email Required.")] 
public string EmailAddress 
{ 
    get { return _EmailAddress; } 
    set { SetValue<string>(ref _EmailAddress, value); } 
} 

Es por eso que necesito que la solución esté en una expresión.

+0

¿Cuál es el/x al final de su expresión regular? En Perl o PHP significaría el modo de espacio libre, pero .NET no usa esa sintaxis. –

+0

Ah ... no lo sé en realidad. Acabo de levantarlo de un sitio en algún lugar. Lo eliminaré y veré si eso ayuda. –

Respuesta

29

Ajustar toda la expresión regular en parens y colocar un? al final:

(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)? 
+0

funcionó como un encanto. Sabía que sería algo simple como esto. :) –

+2

en realidad ... esto no funciona bien. el signo de interrogación final parece hacer que la expresión regular también sea indulgente. Por ejemplo, 555-1234 ahora coincidirá pero no debería. –

+0

Suponiendo que su regex original funciona, puede intentar: \ B | \\ (? \ D {3} \\)? [- \ s.]? \ D {3} [- \ s.] \ D {4 }/x Que debería ser "cadena vacía" O su expresión regular –

1

trate de envolver su expresión regular con (?:<your_regex>)?.

1

Prueba esto:

@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$" 

La parte (?(1)\)|[-\s.]) es un constructor condicional. Dice "Si hubo un '(' al principio (que sabemos porque el grupo # 1 coincidía con algo), haga coincidir un ')' aquí, de lo contrario concuerde un guión, un espacio en blanco o un punto". Y envolver todo en (?:...)? le permite hacer coincidir una cadena vacía, tal como dijo Kevin; si eso no funcionó para ti, debes haber perdido uno de los paréntesis (o tal vez una de las barras diagonales inversas).

He añadido los anclajes ^ y $ con fines de prueba; en un control de validador no deberían ser necesarios.

+0

Curiosamente, su expresión regular bloquea por completo el sitio de verificación de expresión que he estado usando (http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp).Sin embargo, +1 porque la idea general funciona. –

+0

¿Sabes si ese sitio usa el motor de expresiones regulares de .NET? Funciona bien aquí: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

Cuestiones relacionadas