为什么 [^\d\w\s,] 匹配 "leonardo,davinci"?

4

我不明白为什么这个正则表达式:

[^\d\s\w,]

匹配字符串:

"leonardo,davinci"

这是我的测试:

$ echo "leonardo,davinci" | egrep '[^\d\w\s,]'
leonardo,davinci

虽然这个方法达到了预期的效果:

$ echo "leonardo,davinci" | egrep '[\S\W\D]'
$ 

非常感谢你。

1
@blueygh2 整个事情都被否定了。可能与egrep有关,我从未使用过它。 - Josep Valls
1
通常情况下,符号“^”会否定括号内的所有内容。但我不认为这个正则表达式能够匹配该字符串。就我所知,您只匹配了一个字符,而该字符既不是数字、空格字符也不是单词字符。 - Bram Vanroy
1
顺便提一下,[\d\w] 是多余的:\w = [a-zA-Z0-9_] - Sam
使用 grep -P 命令:将模式解释为 Perl 正则表达式 - Jonny 5
1个回答

9
这是因为egrep没有预定义的集合\d\w\s。因此,在它们前面加上斜杠只是字面匹配它们。

leonardo,davinci

echo "leonardo,davinci" | egrep '[^a-zA-Z0-9 ,]'

确实,不匹配。


如果您已安装它,则可以使用pcregrep代替:

echo "leonardo,davinci" | pcregrep '[^\w\s,]'

非常感谢!选项卡也有同样的问题吗?它不会将[^\t]识别为“除制表符外的所有内容”,而是将其视为“除t外的所有内容”... - Luca
@Nopaste,没错。对于\t也会失败:echo -e 'foo\tbar' | egrep '\t'没有匹配项。 - ndnenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接