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

我使用下面的正则expression式来validation逗号分隔的值列表。

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

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

正则expression式在阻止用户input除批准值之外的任何内容方面做得很好,但并不妨碍用户input重复项。 例如,用户可以input“狗”和“狗,猫”,但用户也可以input“狗,狗”。

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

谢谢!

使用反向引用和负面预测:

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

编辑 :这将不适用于例如“猫,狗,狗”的情况下…你需要为这种情况来混合解决scheme – 我不相信有一个正则expression式可以处理这种情况。


这是另一种技术。 你需要检查两件事情,首先,它是否符合这个要求:

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

(这只是你的原始正则expression式的一个稍微更短的版本)

然后,检查它不符合这个:

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

例如

 var valid = string.match( /(?:(?:^|, )(Dog|Cat|Bird|Mouse))+$/ ) && !string.match( /(Dog|Cat|Bird|Mouse).+?\1/ ); 

JP,我试着编辑你的示例正则expression式,以便我可以在任何逗号分隔的string中查找重复项。 像这样的东西:

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

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

再次感谢你的帮助。