solo regular precio numeros letras expresion enteros consecutivos c# regex

c# - numeros - expresion regular precio



¿Puedo probar si una expresión regular es válida en C#sin lanzar una excepción? (8)

Permito a los usuarios ingresar una expresión regular para que coincida con las direcciones IP, para hacer una filtración de IP en un sistema relacionado. Me gustaría validar si las expresiones regulares ingresadas son válidas ya que muchos usuarios se meterán en problemas, aunque con buenas intenciones.

Por supuesto, puedo hacer un Regex.IsMatch () dentro de un try / catch y ver si explota de esa manera, pero ¿hay alguna forma más inteligente de hacerlo? La velocidad no es un problema, simplemente prefiero evitar excepciones sin ningún motivo.


Dependiendo de quién sea el objetivo para esto, sería muy cuidadoso. No es difícil construir expresiones regulares que puedan retroceder sobre sí mismas y consumir mucha CPU y memoria: pueden ser un vector eficaz de denegación de servicio.


En .NET, a menos que escriba su propio analizador de expresiones regulares (que desaconsejaría encarecidamente), seguramente necesitará envolver la creación del nuevo objeto Regex con un try / catch.


No sin mucho trabajo. El análisis Regex puede ser bastante complicado, y no hay nada público en el Marco para validar una expresión.

System.Text.RegularExpressions.RegexNode.ScanRegex () parece ser la función principal responsable de analizar una expresión, pero es interna (y arroja excepciones para cualquier sintaxis inválida de todos modos). Por lo tanto, se le solicitará que vuelva a implementar la funcionalidad de análisis, que sin dudas fallará en casos límite o actualizaciones de Framework.

Creo que solo captar la ArgumentException es una buena idea, como es probable que tenga en esta situación.


Siempre que detecte excepciones muy específicas, solo haga la prueba / captura.

Las excepciones no son malas si se usan correctamente.


Tengo un método para probar si un RegEx es válido, pero simplemente ajusta la expresión regular en Try / Catch. No estoy seguro de si hay una mejor manera de hacerlo, pero no pude encontrar uno.


Una expresión regular mal formada no es la peor de las razones para una excepción.

A menos que renuncie a un subconjunto muy limitado de sintaxis de expresiones regulares, y luego escriba una expresión regular (o un analizador sintáctico) para eso, creo que no tiene otra forma de probar si es válida, sino de intentar crear una máquina de estados a partir de ella y hacer coincide con algo


Creo que las excepciones están bien en este caso.

Esto es lo que armé:

private static bool IsValidRegex(string pattern) { if (string.IsNullOrEmpty(pattern)) return false; try { Regex.Match("", pattern); } catch (ArgumentException) { return false; } return true; }


Al usar el siguiente método, puede verificar si la expresión de su regulador es válida o no. aquí testPattern es el patrón que debes verificar.

public static bool VerifyRegEx(string testPattern) { bool isValid = true; if ((testPattern != null) && (testPattern.Trim().Length > 0)) { try { Regex.Match("", testPattern); } catch (ArgumentException) { // BAD PATTERN: Syntax error isValid = false; } } else { //BAD PATTERN: Pattern is null or blank isValid = false; } return (isValid); }