我正在尝试根据this reply使用否定预读来匹配不包含数字5的数字:
echo "aaa 123467890 3456 bbb" | egrep '[(?!5)[:digit:]]+'
颜色输出显示第二个数字匹配。我该如何解决?
egrep
是否可以将5
从类[:digit:]
中排除? (我进行了许多搜索,但最终都找不到任何内容)
答案 0 :(得分:4)
您的正则表达式有两个问题:
egrep
(与POSIX扩展正则表达式一样)根本不支持先行或先行。[(?!5)[:digit:]]
还是与[[:digit:]()!?]
等效的单个字符类。 (
在字符类中没有任何特殊含义。不幸的是,egrep
也不支持否定命名字符类(如[[:^digit:]]
)。
这仅给您两个选择:
手动计算设置差异并明确列出:
egrep '[0-46-9]+'
切换到PCRE并使用Perl样式的正则表达式
grep -P '[^\D5]+'
(使用双重否定并设置并集来计算集合差的技巧:我们匹配不是非数字或5
的任何字符)或
grep -P '(?:(?!5)\d)+'
(预先确定的版本,已修复)。