Regex 正则表达式检查以前的组

Regex 正则表达式检查以前的组,regex,Regex,我写正则表达式有困难。以下是我的规则: 可以是0到10个数字,用逗号分隔。 每个数字都介于0和2000之间(含0和2000)。 在这个模式中不应该有重复的数字(这是棘手的部分)。 这是我试过的怪物: ^([1-9][0-9]{0,2}|1[0-9]{3}|2000)(,(?!\1)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5)([1-9][0

我写正则表达式有困难。以下是我的规则: 可以是0到10个数字,用逗号分隔。 每个数字都介于0和2000之间(含0和2000)。 在这个模式中不应该有重复的数字(这是棘手的部分)。 这是我试过的怪物:

^([1-9][0-9]{0,2}|1[0-9]{3}|2000)(,(?!\1)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7|\9)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7|\9|\11)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7|\9|\11|\13)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7|\9|\11|\13|\15)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}(,(?!\1|\3|\5|\7|\9|\11|\13|\15|\17)([1-9][0-9]{0,2}|1[0-9]{3}|2000)){0,1}$

在字符串中间的低10s上似乎有数字问题。

有没有更好的方法来解决这个问题

谢谢

您可以使用

^(?!.*\b(\d+)\b.*\b\1\b)(?:(?:[0-9]{1,3}|1[0-9]{3}|2000)(?:,(?:[0-9]{1,3}|1[0-9]{3}|2000)){0,9})?$

详细信息

  • ^
    -字符串的开头
  • (?!.*\b(\d+)\b.*\b\1\b)
    -如果整个单词中有1+个数字的重复块,则会导致匹配失败的负前瞻
  • (?:(?:[0-9]{1,3}1[0-9]{3}2000)(?:,(?:[0-9]{1,3}1[0-9]{3}2000]){0,9}
    -的可选序列(即整个字符串可能为空):
    • (?:[0-9]{1,3}1[0-9]{3}2000)
      -从
      0到
      2000的数字
    • (?:,(?:[0-9]{1,3}1[0-9]{3}2000)){0,9}
      -0到9次出现:
      • -逗号
      • (?:[0-9]{1,3}1[0-9]{3}2000)
        -从
        0到
        2000的数字
  • $
    -字符串结束
要生成特定数字范围的图案,您可以使用(我没有附属关系)。生成的正则表达式可能不是最理想的,但它可以工作


请注意,您可能会使用一种更具可读性和可维护性的方法:使用逗号拆分字符串,确保少于11项,确保它们都是数字,然后检查所有数字是否都在0到2000之间

正是我需要的。谢谢