【问题标题】:Regex repetition正则表达式重复
【发布时间】:2014-10-16 13:21:08
【问题描述】:

我正在尝试执行正则表达式替换。为此我定义了如下表达式:

    ^(?:9903[0]*([0-9]*)){20}$

这个表达式应该匹配到

    99030000000000000001
    99030000000000000011
    99030000000000000111
    99030000000000001111
    99031111111111111111

但不是

    9903111111111111111

事实上,在我使用 {1,20} 作为量词或完全删除它之前,上面的表达式不起作用。但是因为我想在不知道 [0]* 长度和变量长度的情况下检查整个字符串的长度,所以我的表达式有问题。

非常感谢您提前提供的帮助。

D

【问题讨论】:

  • ^(?:66){2}$,长度必须是 4 而不是 2。
  • 你的例子不是很清楚,9903后面可以跟任何数字吗?
  • [0]*[0-9]*要匹配什么?

标签: regex repeat quantifiers


【解决方案1】:

您的初始正则表达式有很多问题。

{} 部分应用于括号之间的整个 整个 部分。所以你当前的正则表达式需要这部分:

(?:9903[0]*([0-9]*))

全部重复了 20 次,这不是你想要的。

然后这部分:

[0]*([0-9]*)

意义不大,你想捕获9903 之后没有前导零的数字吗?然后要求捕获以非零数字开始。 [0] 是一个只有一个字符的字符类,相当于只有0

最后,我会这样做:

^9903(?=[0-9]{16}$)0*([1-9][0-9]*)$

Regex101

编辑:我后来意识到,如果需要匹配 99030000000000000000(在您的捕获组中获取 0),那么您需要这个:

^9903(?=[0-9]{16}$)0*([0-9]+)$

Regex101

【讨论】:

    【解决方案2】:

    您可以通过使用lookahead 预先检查字符串的长度来做到这一点:

    ^(?=[0-9]{20}$)99030*[0-9]*
    

    前瞻(?=...) 是一个零宽度断言,用于检查字符串中的后续内容。这里是检查字符串末尾是否正好有 20 位数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2016-06-13
      相关资源
      最近更新 更多