我正在寻找foo
和bar
的所有组合,无论哪个顺序都可以跨多行(实际上,不超过5行)。这是一个测试文件:
$ cat test
foo
a
bar
b
1 foo 2 bar 3
1 foo2bar 3
bar
a
foo
b
1 bar 2 foo 3
1 bar2foo 3
在使用pcregrep
时,我无法将各个字符与换行符匹配。我可以很好地匹配所有单个字符:
$ pcregrep --color -Mi '(foo.*bar)?(bar.*foo)?' test
test:1 foo 2 bar 3
test:1 foo2bar 3
test:1 bar 2 foo 3
test:1 bar2foo 3
$
然而,可以看出多线foo / bar组合不匹配。因此,我尝试匹配所有字符\.
和换行符\n
,但这不会返回任何行:
$ pcregrep --color -Mi '(foo[.\n]*bar)?(bar[.\n]*foo)?' *
$
事实上,.
组中的[]
运算符似乎无法与单个字符匹配:
$ pcregrep --color -Mi '(foo[.]*bar)?(bar[.]*foo)?' *
$ pcregrep --color -Mi '(foo[\.]*bar)?(bar[\.]*foo)?' *
$
如何将.
运算符放入[]
组?
答案 0 :(得分:7)
点与换行符不匹配,您可以使用单线修饰符(?s)
,允许点匹配换行符(或用[\s\S]
替换点数)
pcregrep --color -Mi '(?s)(foo.*?bar)?(bar.*?foo)?' test
或
pcregrep --color -Mi '(?s)(?|foo(.*?)bar|bar(.*?)foo)' test
或简单地说:
pcregrep --color -Mi '(?s)(foo.*?bar|bar.*?foo)' test
如果在字符类中放置正则表达式特殊字符,则将其视为文字。