【问题标题】:Coding a regex to return true for an EXACT count of a group编码正则表达式以对组的精确计数返回 true
【发布时间】:2016-11-02 01:04:29
【问题描述】:

我正在使用下面的正则表达式来返回正好包含 3 个数字 6,7 和 8 实例的数字(每个数字之间有 0 到许多其他数字)。我知道必须有一种方法可以在不匹配更多实例的情况下精确匹配 3,但我无法在任何地方找到它。

echo $num | egrep '(6.*|7.*|8.*){3}' | egrep -v '(6.*|7.*|8.*){4}' | egrep -v '(6.*|7.*|8.*){5}'`

我正在尝试匹配 4561863 之类的数字,但不是 466773。

【问题讨论】:

    标签: regex linux bash grep


    【解决方案1】:

    诀窍是首先匹配不是 6、7 或 8 的任意数字,然后匹配以 6、7 或 8 开头的 3 组数字,后跟任意not-6,7,8 的数量。

    echo "$num" | grep -E '^[0-5,9]*([6-8][0-5,9]*){3}$'
    

    【讨论】:

    • 我忘记了-E 选项;否则,您需要转义括号和大括号,如下所示:[0-5,9]*\([6-8][0-5,9]*\)\{3\}.
    • 宾果游戏!谢谢,这正是我所需要的
    【解决方案2】:

    这里的an example Regex 似乎有效。

    echo "$num" | grep -E '\b[^678]*[678][^678]*[678][^678]*[678][^678]*\b'
    

    您希望在每个数字中匹配零个或多个非 678、一个 678、零个或多个非 678、一个 678、零个或多个非 678、一个 678,最后是零个或多个非 678。

    【讨论】:

    • [^678] 假定 $num 仅包含数字。
    • 当然$num 只包含数字。 OP说I'm trying to match numbers like 4561863 but not 466773.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2023-04-06
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2011-05-15
    • 2021-03-16
    相关资源
    最近更新 更多