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

Regex 只限制正则表达式的一部分而不是整个表达式本身?,regex,wildcard,digits,maxlength,Regex,Wildcard,Digits,Maxlength,因此,我有一个输入字段,客户机可以在其中键入长度为1-10的数字,并使用至少有1个数字作为前缀的通配符。(*是不允许的,而1*将是) 通配符可以设置在字符串的中间,但是表达式的最大最大长度为10。 此时,我通过以下表达式得到了这个结果: ^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$ 现在问题来了。正如您在表达式中看到的,分隔符空格、逗号和分号可以出现在字符串的开头或结尾,因为客户端可以在该组合中输入多个数字[,;]? 但他不能,因

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

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

^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$
现在问题来了。正如您在表达式中看到的,分隔符空格、逗号和分号可以出现在字符串的开头或结尾,因为客户端可以在该组合中输入多个数字<代码>[,;]?

但他不能,因为最大长度为10
(?=.{1,10}$)
。 另一方面,如果我取消了最大长度限制,那么您可以输入一个长度超过10个字符的数字(目前最多19个字符)
123456789*123456789
->将不受限制

有没有办法这样限制表达式,分隔符之间的字符长度必须为10绝对最大长度,但总的来说,最大长度可以更长以输入更多的数字?

可能:

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

由于您希望以至少一位数字开始一个数字,因此以下内容将匹配:

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

EDIT1:上面允许在后面加逗号、分号或空格。如果要避免这种情况,您可以使用:

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


EDIT2:上述方法只允许每个数字使用一个通配符。如果您的意图是允许多个(但不能紧随其后),您可以尝试:

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


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

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

查看联机

这看起来是一个完美的解决方案!尝试了许多案例,迄今为止效果很好-非常感谢您的帮助:)您的编辑表达式出现错误,因为您可以在后面键入多个通配符。第一个可以很好地处理此错误,但正如您所提到的,它允许拖尾分隔符。@EXTSY,您是正确的。我修改了它,所以它应该停止这样做。顺便说一句,这也将只允许一个通配符的最大值。这是你的意图吗?谢谢你的编辑!起初,它的目的只是在每个数字中使用一个通配符,但仔细考虑之后,我认为,实际上,能够使用多个通配符是有意义的。所以我很高兴你在这里给了我两种解决方案如果您正在改变对这些通配符的看法,您可能需要考虑使用连续通配符。如果是这样的话,我甚至添加了一个选项,这个选项正好可以做到这一点(但强制数字仍然以数字开头)。您可以添加一两个示例(每个示例都显示所需的结果)?@CarySwoveland您可以在最后清除蜘蛛网后看到示例我修改了我的答案(建议
^\d[\d*]{0,9}(?:[,;]\d[\d*]{0,9})*$
)但后来注意到@JvdV在“EDIT3”中提出了基本相同的建议,所以我删除了我的答案。