为什么在使用 -zoP 调用时 grep 延迟匹配并匹配后跟换行符的反向引用?
Why does grep match lazily when invoked with -zoP and matching backreference followed by newline?
我有一个文件cases
:
foo
bar
cases:
1: foo
2: bar
baz
cases:
3: baz
quux
由于缩进总是在案例之后再次返回我想用 grep -zoP '(\s*)cases:\n(.*\n)*' cases
列出案例,但是输出
cases:
cases:
而如果我使用 grep -zoP '(\s*)cases:\n(.*\n){1,}' cases
,我得到我想要的输出:
cases:
1: foo
2: bar
cases:
3: baz
我试过的任何类似正则表达式都没有出现这种行为:
$ grep -o '\(foo\)bar\(\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar()*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar()*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo
$
为什么 grep 更愿意匹配我的正则表达式 0 次?
我以为是bug,结果被指出\s
,是POSIX字符的同义词class [:space:]
对应[ \t\n\r\f\v]
在 C 语言环境中,因此也匹配前面的换行符。
我有一个文件cases
:
foo
bar
cases:
1: foo
2: bar
baz
cases:
3: baz
quux
由于缩进总是在案例之后再次返回我想用 grep -zoP '(\s*)cases:\n(.*\n)*' cases
列出案例,但是输出
cases:
cases:
而如果我使用 grep -zoP '(\s*)cases:\n(.*\n){1,}' cases
,我得到我想要的输出:
cases:
1: foo
2: bar
cases:
3: baz
我试过的任何类似正则表达式都没有出现这种行为:
$ grep -o '\(foo\)bar\(\)*'<<<$'foobarfoofoofoofoo'
foobarfoofoofoofoo
$ grep -o '\(foo\)bar\(\)*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -oP '(foo)bar()*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)bar()*'<<<$'foobarfoofoofoofoobax'
foobarfoofoofoofoo
$ grep -zoP '(foo)\n*bar'<<<$'foo\n\n\n\n\n'
foo
$
为什么 grep 更愿意匹配我的正则表达式 0 次?
我以为是bug,结果被指出\s
,是POSIX字符的同义词class [:space:]
对应[ \t\n\r\f\v]
在 C 语言环境中,因此也匹配前面的换行符。