不包含数字5的数字

时间:2018-09-12 15:59:16

标签: regex grep

我正在尝试根据this reply使用否定预读来匹配不包含数字5的数字:

echo "aaa 123467890 3456 bbb" | egrep '[(?!5)[:digit:]]+'

颜色输出显示第二个数字匹配。我该如何解决?

egrep是否可以将5从类[:digit:]中排除? (我进行了许多搜索,但最终都找不到任何内容)

1 个答案:

答案 0 :(得分:4)

您的正则表达式有两个问题:

  1. egrep(与POSIX扩展正则表达式一样)根本不支持先行或先行。
  2. 即使这样做,[(?!5)[:digit:]]还是与[[:digit:]()!?]等效的单个字符类。 (在字符类中没有任何特殊含义。

不幸的是,egrep也不支持否定命名字符类(如[[:^digit:]])。

这仅给您两个选择:

  • 手动计算设置差异并明确列出:

    egrep '[0-46-9]+'
    
  • 切换到PCRE并使用Perl样式的正则表达式

    grep -P '[^\D5]+'
    

    (使用双重否定并设置并集来计算集合差的技巧:我们匹配不是非数字或5的任何字符)或

    grep -P '(?:(?!5)\d)+'
    

    (预先确定的版本,已修复)。