代码之家  ›  专栏  ›  技术社区  ›  Kuyenda

是否有一个逗号分隔的离散值列表的正则表达式?

  •  6
  • Kuyenda  · 技术社区  · 16 年前

    我使用下面的正则表达式来验证以逗号分隔的值列表。

    ^Dog|Cat|Bird|Mouse(, (Dog|Cat|Bird|Mouse))*$
    

    这些值也列在Excel单元格验证的下拉列表中,因此用户可以从下拉列表中选择单个值,或键入多个用逗号分隔的值。

    正则表达式可以很好地防止用户输入除了已批准的值以外的任何值,但不能防止用户输入重复的值。例如,用户可以输入“dog”和“dog,cat”,但用户也可以输入“dog,dog”。

    是否有任何方法可以使用类似的单个正则表达式来防止重复?换言之,我需要能够执行一个经过批准的逗号分隔值的离散列表。

    谢谢!

    2 回复  |  直到 12 年前
        1
  •  11
  •   James    16 年前

    使用后向引用和负向前看:

    ^(Dog|Cat|Bird|Mouse)(, (?!\1)(Dog|Cat|Bird|Mouse))*$
    

    编辑 :这不适用于“猫、狗、狗”等情况…对于这种情况,您需要提出一个混合解决方案-我不相信有一个regex可以处理这个问题。


    这是另一种方法。您需要检查两件事,首先,它确实与此匹配:

    (?:(?:^|, )(Dog|Cat|Bird|Mouse))+$
    

    (这只是一个略短版本的原始regex)

    然后,检查它是否与此不匹配:

    (Dog|Cat|Bird|Mouse).+?\1
    

    例如。

    var valid = string.match( /(?:(?:^|, )(Dog|Cat|Bird|Mouse))+$/ ) &&
               !string.match( /(Dog|Cat|Bird|Mouse).+?\1/ );
    
        2
  •  0
  •   Kuyenda    16 年前

    J-P,我尝试编辑您的示例正则表达式,以便在任何逗号分隔的字符串中查找重复项。像这样:

    var valid = string.match( /(?:(?:^|, )([a-z]*))+$/ ) &&
        !string.match( /([a-z]*).+?\1/ );
    

    不幸的是,我失败了。我的力量很弱。;)

    再次感谢你的帮助。