【问题标题】:Why does grep match lazily when invoked with -zoP and matching backreference followed by newline?为什么当使用 -zoP 调用 grep 并匹配反向引用后跟换行符时,grep 会延迟匹配?
【发布时间】:2018-10-16 04:45:35
【问题描述】:

我有一个文件cases:

foo
bar
  cases:
    1: foo
    2: bar
baz
  cases:
    3: baz
quux

由于缩进总是在我想用grep -zoP '(\s*)cases:\n(\1.*\n)*' cases 列出案例之后再次返回,但是输出

  cases:

  cases:

而如果我使用grep -zoP '(\s*)cases:\n(\1.*\n){1,}' cases,我会得到我想要的输出:

  cases:
    1: foo
    2: bar
  cases:
    3: baz

我尝试过的任何类似的正则表达式都不会出现这种行为:

$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\1\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar(\1)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo







$

为什么 grep 喜欢匹配我的正则表达式 0 次?

【问题讨论】:

  • 最后一个例子对吗?我还在它的末尾得到bar。还有,你最后一句话好像被删了。
  • @BenjaminW。感谢您指出这一点,已修复。
  • 我认为问题出在\1,因为反向引用强制匹配完全相同的字符,如果空格数不同,则失败,即grep -zoP '(\s*)cases:\n(\s.*\n)*' cases

标签: regex grep posix pcre


【解决方案1】:

我认为这是一个错误,但有人指出 \s,它是 POSIX 字符类 [:space:] 的同义词,对应于 C 语言环境中的 [ \t\n\r\f\v],因此也匹配前面的换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2013-08-12
    • 2012-10-24
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多