2

我有一个匹配“x”的正则表达式,如果它前面有一个非空格字符而不是"任意数量的空格字符:

[^"\s]\s*x

这在 JavaScript 中按预期工作:

$ node
> /[^"\s]\s*x/.test('x')
false
> /[^"\s]\s*x/.test(' x')
false
> /[^"\s]\s*x/.test('" x')
false
> /[^"\s]\s*x/.test(': x')
true

但是,grep 的行为有所不同:

$ echo 'x' | grep '[^"\s]\s*x'

$ echo ' x' | grep '[^"\s]\s*x'
 x

$ echo '" x' | grep '[^"\s]\s*x'
" x

$ echo ': x' | grep '[^"\s]\s*x'
: x

这种行为有解释吗?我将如何重写 grep 的正则表达式,使其按预期运行?

4

2 回答 2

4

根据this page ,其中的反斜杠[]是按字面意思理解的。因此,您的否定组不是“不是引号或空格字符”,而是“不是引号、反斜杠或 s”。

试试[^"[:space:]]

于 2013-02-17T05:40:29.647 回答
3

您可以指示 grep 与-P选项兼容 Perl:

$ echo 'x' | grep -P '[^"\s]\s*x'

$ echo ' x' | grep -P '[^"\s]\s*x'

$ echo '" x' | grep -P '[^"\s]\s*x'

$ echo ': x' | grep -P '[^"\s]\s*x'
: x

-P编辑:在他们移除开关后在 Mac 上不可能

于 2013-02-17T05:50:45.817 回答