regex - 非贪婪模式表达式

标签 regex sed

我一直在阅读 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)...

模式(引用 Friedl)可能来自:
  • [ 正常*关闭 ]

  • 转到真正的多字符 ' 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 ' 分隔符 特价表达式可以扩展为:
    (a[^b]*)*(ab[^c]*)*
    
  • 这样对吗?
  • 可以证明吗?
  • 可以特价表达要简化吗?
  • 是否有更好/更有效的表达方式?不详我没有使用 perl 的非贪婪 '*?'操作符,避免交替。
  • 我在哪里可以找到此类问题的引用资料(Friedl 提到但没有发布解决方案)。
  • 最佳答案

  • 是的,它看起来是正确的。
  • 您想了解有限自动机 - 非确定性 (NFA) 和确定性 (DFA)。简单的正则表达式系统本质上是有限自动机的一种方便的表示法。任何关于编译器的好书都会有一章介绍 NFA 和 DFA。
  • 可能没有,或者不多。你的话越长,你必须允许的回溯越多。
  • 关于regex - 非贪婪模式表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869638/

    相关文章:

    linux - 删除以 # 开头的字符串以及 # 之后的所有内容

    bash - 打印由第二个文件索引的行

    scripting - 如何使用 sed 或 awk 删除符合某些字段条件的行?

    r - 根据 R 中的模式集合提取数字

    regex - 再次验证电子邮件地址

    regex - 如何增加 gsub() 替换字符串?

    java - 正则表达式内部数字检查

    linux - 替换一行结束后的第二个点

    regex - awk 删除数字后的字符

    php - 如何解析 PHP 项目,查找代码中出现的函数并检测每次调用中的调用参数?