2009-08-09 18 views
15

Después de leer un muy buen article sobre optimización de expresiones regulares en java me preguntaba ¿cuáles son los otros buenos consejos para crear expresiones regulares rápidas y eficientes?Sugerencias y trucos de optimización de rendimiento Regex

+0

me gustaría mencionar [Secuencia de Boole] (https://github.com/NaturalIntelligence/BooleanSequence) que actualmente admite menos símbolos de ER pero son rápidos, flexibles y están llenos de muchas funciones útiles. Puede escribir sus propios mezcladores para agregar más funciones o para hacerlas más rápidas. También realizan la optimización automática y puede ver cómo se evalúan utilizando gráficos basados ​​en json o json. –

Respuesta

7

uso del cualquier (punto) del operador con moderación, si puede hacerlo de otra manera, hacerlo, punto siempre le muerde ...

no estoy seguro de si PCRE es NFA y estoy solo familiarizados con PCRE, pero + y * generalmente son 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.

3

Sepa 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: suponga que desea hacer coincidir un entero que sea divisible por 3. Es trivial diseñar una máquina de estados finitos para lograr esto, y por lo tanto debe existir una expresión regular, pero escribirla no es tan trivial, y ¡No me gustaría tener que depurarlo!

+1

Sí ... pero es trivial en algunos sistemas numéricos. :-P –

+9

quieres decir esto: '(((0 | 3 | 6 | 9) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (2 | 5 | 8))) | (((2 | 5 | 8) | ((1 | 4 | 7) (0 | 3 | 6 | 9) * (1 | 4 | 7))) ((0 | 3 | 6 | 9) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (1 | 4 | 7))) * ((1 | 4 | 7) | ((2 | 5 | 8) (0 | 3 | 6 | 9) * (2 | 5 | 8))))) * '? (Sí, hice un DFA y luego GNFA y luego regex: p) –

+1

Utilice una implementación rápida cuando no tenga referencias. https://swtch.com/~rsc/regexp/regexp1.html – clemens

27
  1. Uso del grupo de no capturar (?:pattern) cuando es necesario repetir una agrupación, pero no es necesario utilizar el valor capturado que proviene de un grupo tradicional (capturing).
  2. Utilice la atomic group (o subexpresión sin retroceso) cuando corresponda (?>pattern).
  3. Evite catastrophic backtracking como la peste mediante el diseño de sus expresiones regulares para terminar temprano para las coincidencias.

Creé un video que demostraba estas técnicas. Empecé con muy expresión regular mal escrito en el catastrophic backtracking 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 vídeo es específico de .NET pero muchas de estas cosas se aplican a la mayoría de los otros sabores de expresiones regulares, así:

.NET Regex Lesson: #5: Optimization

Cuestiones relacionadas