我使用以下正则表达式来验证逗号分隔的值列表。
^Dog|Cat|Bird|Mouse(, (Dog|Cat|Bird|Mouse))*$
这些值也列在Excel单元格验证的下拉列表中,因此用户可以从下拉列表中选择单个值,或键入以逗号分隔的多个值。
正则表达式可以很好地防止用户输入除批准值之外的任何内容,但它不会阻止用户输入重复项。例如,用户可以输入“Dog”和“Dog,Cat”,但用户也可以输入“Dog,Dog”。
有没有办法使用类似的单个正则表达式来防止重复?换句话说,我需要能够强制执行批准的逗号分隔值的离散列表。
谢谢!
答案 0 :(得分:11)
使用反向引用和否定前瞻:
^(Dog|Cat|Bird|Mouse)(, (?!\1)(Dog|Cat|Bird|Mouse))*$
编辑:这不适用于“猫,狗,狗”等情况......你需要针对此类情况提出混合解决方案 - 我不相信有一个正则表达式可以处理它。
这是另一种技术。您需要检查两件事,首先,它与此匹配:
(?:(?:^|, )(Dog|Cat|Bird|Mouse))+$
(这只是原始正则表达式的略短版本)
然后,检查它是否与此匹配:
(Dog|Cat|Bird|Mouse).+?\1
E.g。
var valid = string.match( /(?:(?:^|, )(Dog|Cat|Bird|Mouse))+$/ ) &&
!string.match( /(Dog|Cat|Bird|Mouse).+?\1/ );
答案 1 :(得分:0)
J-P,我尝试编辑你的样本正则表达式,这样我就可以在任何逗号分隔的字符串中查找重复项。像这样:
var valid = string.match( /(?:(?:^|, )([a-z]*))+$/ ) &&
!string.match( /([a-z]*).+?\1/ );
不幸的是,我失败了。部队对我很弱。 ;)
再次感谢您的帮助。