如何匹配[]组内的任意字符?

时间:2014-03-05 11:57:36

标签: regex linux bash grep

我正在寻找foobar的所有组合,无论哪个顺序都可以跨多行(实际上,不超过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)?' *
$

如何将.运算符放入[]组?

1 个答案:

答案 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

如果在字符类中放置正则表达式特殊字符,则将其视为文字。