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

时间:2009-10-16 15:03:02

标签: regex excel

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

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

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

正则表达式可以很好地防止用户输入除批准值之外的任何内容,但它不会阻止用户输入重复项。例如,用户可以输入“Dog”和“Dog,Cat”,但用户也可以输入“Dog,Dog”。

有没有办法使用类似的单个正则表达式来防止重复?换句话说,我需要能够强制执行批准的逗号分隔值的离散列表。

谢谢!

2 个答案:

答案 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/ );

不幸的是,我失败了。部队对我很弱。 ;)

再次感谢您的帮助。