2011-10-23 82 views
11

我一直在阅读Friedl的“掌握正则表达式”,并试图为一个由单词定界的字符串设计一个通用的非贪婪模式表达式。 从基础开始,其中限定词仅仅是一个单独的字符“一个”表达式:非贪婪模式表达式

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)... 

从该图案(参照弗里德尔)可能是:

  • [正常*关闭]

移动到一个真正的多字符' AB '分隔符:

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)... 

从该图案可能是:

  • [正常*(特殊*)*闭]

对于随后的' abc'定界符specia升表达可以扩展到:

(a[^b]*)*(ab[^c]*)* 
  1. 这是正确的吗?
  2. 可以证明吗?
  3. 可以将特殊表达式简化吗?
  4. 对此有更好/更有效的表达方式吗?注:我没有使用perl的非贪婪'*?'操作员并避免交替。
  5. 我在哪里可以找到这类问题的参考资料(Friedl提到,但没有公布的解决方案)。
+0

我离“掌握正则表达式”还很遥远,这并不好笑。但是我被捕了。你想解释一下为什么你不想使用这两个操作符:?和|。欣赏它。 – Mithon

+0

为什么不使用负向预测? – lkuty

+0

@Ikuty恐怕这不是sed报告的一部分。 – potong

回答

1
  1. 是的,它看起来是正确的。
  2. 您想了解有限自动机 - 非确定性(NFA)和确定性(DFA)。简单的正则表达式系统本质上是有限自动机的一个便利表示法。任何关于编译器的好书都会有一章涉及NFA和DFA。
  3. 可能不是,或者不多。你的话越长,你必须允许的回溯越多。