【问题标题】:regex - allow only single digit numbers in a string正则表达式 - 字符串中只允许单个数字
【发布时间】:2021-11-11 21:27:44
【问题描述】:

我需要匹配一个最大长度为 1 到 20 个字符的字符串,它包含字母 a-g 和数字 1-7。但是,数字不能相邻 - 只允许单个数字。

有效字符串: aabbca1a6, 4gg1g2g1, 1

无效字符串: aabbca16a - 两个数字相邻,形成一个两位数 16。

我可以很容易地用[a-g1-7]{1,20} 匹配大多数字符串,但是我不知道如何有效地检测两个数字何时彼此相邻。

目前在我的程序中,通过正则表达式解析后,我只是在循环中再次遍历整个字符串,确保没有 2 个数字彼此相邻,但是我希望这一切都可以完成只有一个(简单的)正则表达式。

【问题讨论】:

  • 语言是什么?如果支持负前瞻,那么可以使用这个^(?!.*\d{2}).*$
  • 我在 c++ 程序中使用它 - std::regex.
  • 好的,对于 std:regex 它应该可以工作^(?!.*\d{2})[a-g1-7]{1,20}$

标签: regex


【解决方案1】:

您可以使用来自 Ulugbek Umirov 的 cmets 的答案,在锚定字符串的开头使用否定前瞻,断言右侧不是 2 位数字。

^(?!.*\d{2})[a-g1-7]{1,20}$

模式匹配:

  • ^ 字符串开始
  • (?!.*\d{2}) 负前瞻,断言不是 2 位数字
  • [a-g1-7]{1,20}将字符类中的范围重复1-20次
  • $字符串结束

Regex demo

另一个选项可能是断言字符串长度并以彼此不能有 2 位数字的方式重复匹配

^(?=[a-g1-7]{1,20}$)[a-g]*(?:[1-7][a-g]+)*[0-7]?$

Regex demo

【讨论】:

    【解决方案2】:

    最简单的正则表达式和方法是检查它是否匹配:

    .*\d\d.*
    

    【讨论】:

      【解决方案3】:

      解决这个问题最好的办法就是使用这个技巧

      -使用此模式检查1-7之间的数字和a-g之间的字符是否不是兄弟姐妹

      ^[1-7]?([a-g]+[1-7]?)*
      

      -然后您可以使用字符串方法检查字符串的长度,例如(JavaScript 中的长度方法)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2017-06-25
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多