只限制正则表达式的一部分而不是整个表达式本身?

Limit only parts of a Regular Expression not the whole expression itself?

所以我有一个输入字段,客户可以在其中输入长度为 1-10 的数字,并使用至少有 1 个数字作为前缀的通配符。 (* 不允许,而 1* 可以)

可以在字符串中间设置通配符,但表达式的整体最大长度为10。 此时我通过以下表达式收到了这个结果:

^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$

现在是问题。正如您在表达式中看到的,分隔符 SPACE、COMMA 和 SEMI-COLON 允许出现在字符串的开头或结尾,因为客户端可以在该组合中输入多个数字。 [ ,;]?

但他不能,因为最大长度为 10 (?=.{1,10}$)。 另一方面,如果我删除最大长度限制,那么您可以输入一个超过 10 的数字(现在最多正好是 19 个字符)123456789*123456789 -> 将被允许不受限制。

有什么方法可以限制表达式,分隔符之间的字符长度必须是 10 个绝对最大长度,但总的来说最大长度可以更长以输入更多数字?

也许:

^(?:\d(?=\d*\*?\d*(?:[ ,;]|$))[\d*]{0,9}(?:[ ,;]|$))+$

在线查看demo

由于您希望数字至少以一位数字开头,因此以下匹配;

  • ^ - 字符串锚的开始。
  • (?: - 打开第一个非捕获组。
    • \d - 匹配单个数字。
    • (?= 打开正向先行。
      • \d*\*?\d* - 任意数量的数字,一个可选的通配符,以及任意数量的数字(只允许一个通配符)。
      • (?: - 打开嵌套的第二个非捕获组。
        • [ ,;]|$ - 匹配字符 class 中的任意字符然后字符串结尾.
        • ) - 关闭第二个非捕获组。
      • ) - 关闭正面前瞻。
    • [\d*]{0,9} - 匹配字符 class 中的 0-9 个字符(数字或通配符)。
    • (?: - 打开第三个非捕获组。
      • [ ,;]|$ - 匹配字符 class 中的任意字符然后字符串结尾.
      • ) - 关闭第三个非捕获组。
    • ) - 关闭第一个非捕获组。
  • + - 至少重复第一个非捕获组一次。
  • $ - 结束字符串锚点。

EDIT1:以上内容允许尾随逗号、分号或 space。如果你想避免这种情况,你可以使用:

^(?:\d(?=\d*\*?\d*[ ,;])[\d*]{0,9}[ ,;])*\d(?=\d*\*?\d*$)[\d*]{0,9}$

在线查看demo


EDIT2:上面的每个数字只允许一个通配符。如果您的意图是允许多个(但不是一个接一个,您可以尝试:

^(?:\d(?!.*\*\*.*[ ,;])[\d*]{0,9}[ ,;])*\d(?!.*\*\*.*$)[\d*]{0,9}$

在线查看demo


EDIT3:如果出于某种原因您决定 想要允许连续的通配符(但仍然至少以一位数字开头),您可以选择:

^(?:\d[\d*]{0,9}[ ,;])*\d[\d*]{0,9}$

在线查看demo