2011-10-23 12 views
11

He estado leyendo "Mastering Regular Expressions" de Friedl y tratando de idear una expresión de patrón común no codicioso para una cadena delimitada por una palabra. A partir de lo básico donde la palabra delimitada es sólo un único carácter 'un' la expresión:Expresión de patrón no codicioso

sed -r 's/([^a]*)(a)/\                 
(1)\1(2)\2(ALL)&(END)/g' <<<"xaxxaxxxaxxx...aa..." 

(1)x(2)a(ALL)xa(END) 
(1)xx(2)a(ALL)xxa(END) 
(1)xxx(2)a(ALL)xxxa(END) 
(1)xxx...(2)a(ALL)xxx...a(END) 
(1)(2)a(ALL)a(END)... 

de la que el patrón (con referencia a Friedl) podría ser:

  • [normal * cerrando]

Pasando a un verdadero personaje múltiple ' ab 'delimitador:

sed -r 's/([^a]*)((a[^b]*)*)(ab)/\       
(1)\1(2)\2(3)\3(4)\4(ALL)&(END)/g' <<<"xabxxabxxxabxxx...abxxx...aabxxx...axxx...aaabxaabaxabaxaxabxaxaabxxaaabaaxxab..." 

(1)x(2)(3)(4)ab(ALL)xab(END) 
(1)xx(2)(3)(4)ab(ALL)xxab(END) 
(1)xxx(2)(3)(4)ab(ALL)xxxab(END) 
(1)xxx...(2)(3)(4)ab(ALL)xxx...ab(END) 
(1)xxx...(2)a(3)a(4)ab(ALL)xxx...aab(END) 
(1)xxx...(2)axxx...aa(3)axxx...aa(4)ab(ALL)xxx...axxx...aaab(END) 
(1)x(2)a(3)a(4)ab(ALL)xaab(END) 
(1)(2)ax(3)ax(4)ab(ALL)axab(END) 
(1)(2)axax(3)axax(4)ab(ALL)axaxab(END) 
(1)x(2)axa(3)axa(4)ab(ALL)xaxaab(END) 
(1)xx(2)aa(3)aa(4)ab(ALL)xxaaab(END) 
(1)(2)aaxx(3)aaxx(4)ab(ALL)aaxxab(END)... 

de la que el patrón podría ser:

  • [* normal (especial *) * cierre]

Para la posterior' abc 'delimitador el specia l expresión puede extenderse a:

(a[^b]*)*(ab[^c]*)* 
  1. Es esto correcto?
  2. ¿Se puede probar?
  3. ¿Se puede simplificar la expresión especial?
  4. ¿Hay expresiones mejores/más eficientes para esto? nótese bien. No estoy usando el no-codicioso "*?" De Perl operador y evitando la alternancia.
  5. Dónde podría encontrar material de referencia para este tipo de problema (Friedl aludió pero no llegó a una solución publicada).
+0

Estoy tan lejos de "Mastering Regular Expressions" que ni siquiera es gracioso. Estoy interesado, sin embargo. ¿Le importaría explicar por qué no quiere usar esos dos operadores? y | Lo aprecio. – Mithon

+0

¿Por qué no utilizar el lookahead negativo? – lkuty

+0

@Ikuty Me temo que eso no forma parte del informe de sed. – potong

Respuesta

1
  1. Sí, parece correcto.
  2. Desea leer acerca de los autómatas finitos no deterministas (NFA) y deterministas (DFA). Los sistemas simples de expresiones regulares son esencialmente una notación práctica para autómatas finitos. Cualquier buen libro sobre compiladores tendrá un capítulo que cubra NFA y DFA.
  3. Probablemente no, o no mucho. Cuanto más larga es tu palabra, más retrocesos debes tener en cuenta.
Cuestiones relacionadas