Pregunta Sugerencias y trucos de Regex Performance Optimization [cerrado]


Después de leer una muy buena artículo sobre la optimización de expresiones regulares en java me preguntaba ¿cuáles son los otros buenos consejos para crear expresiones regulares rápidas y eficientes?


17


origen


Respuestas:


  1. Usa el grupo que no captura (?:pattern) cuando necesita repetir un agrupamiento pero no necesita usar el valor capturado que proviene de un tradicional (capturing) grupo.
  2. Utilizar el grupo atómico (o subexpresión sin retroceso) cuando corresponda (?>pattern).
  3. Evitar retroceso catastrófico como la peste, diseñando sus expresiones regulares para terminar temprano para las que no coinciden.

Creé un video que demuestra estas técnicas. Empecé con el muy expresión regular mal escrita en el retroceso catastrófico artículo (x+x+)+y. Y luego lo hice 3 millones de veces más rápido después de una serie de optimizaciones, evaluación comparativa después de cada cambio. El video es específico de .NET, pero muchas de estas cosas se aplican a la mayoría de los sabores de expresiones regulares también:

Lección .NET Regex: # 5: Optimización


29



Usa el operador any (dot) con moderación, si puedes hacerlo de otra forma, hazlo, el punto siempre te morderá ...

No estoy seguro de si PCRE es NFA y solo estoy familiarizado con PCRE, pero + y * son generalmente codiciosos por defecto, coincidirán tanto como sea posible para cambiar el uso de + y *? para que coincida con el mínimo posible, tenga en cuenta estas dos cláusulas al escribir su expresión regular.


7



Saber cuándo no para usar una expresión regular, a veces una solución codificada a mano es más eficiente y más comprensible.

Ejemplo: supongamos que desea hacer coincidir un entero que sea divisible de manera uniforme entre 3. Es trivial diseñar una máquina de estados finitos para lograr esto, y por lo tanto debe existir una expresión regular correspondiente, pero escribirla no es tan trivial, y estoy seguro odio tener que depurarlo!


3



Preguntas populares