Regex 正则表达式以避免分隔字符串中的数据重复?

Regex 正则表达式以避免分隔字符串中的数据重复?,regex,regex-lookarounds,regex-greedy,Regex,Regex Lookarounds,Regex Greedy,我正在尝试验证将是字符串值且以,分隔的数据。我想验证的是,在sting中不应该重复相同的值 我的价值是 data1 = "value1,value2,value3,va-lu4,value 6,value1";//should fail data2 = "value1,value2,value3,va-lu4,value 6";//should pass 在上述场景中,data1应该失败,因为它包含value1两次。而在data2中应该通过或匹配,因为它不包含任何重复值 这是我

我正在尝试验证将是
字符串
值且以
分隔的数据。我想验证的是,在
sting
中不应该重复相同的值

我的价值是

    data1 = "value1,value2,value3,va-lu4,value 6,value1";//should fail
    data2 = "value1,value2,value3,va-lu4,value 6";//should pass
在上述场景中,
data1
应该失败,因为它包含
value1
两次。而在
data2中
应该通过或匹配,因为它不包含任何重复值

这是我匹配每个值得到的结果,但不确定如何检查重复

    ^[-\w\s]+(?:,[-\w\s]*)*$
这将匹配分隔符之间的值,但不确定如何检查是否存在重复值。任何帮助都会很好。
注意-我知道我可以使用sting函数和循环来实现这一点,但我正在学习
正则表达式
,如果可能的话,我想尝试使用正则表达式。如果感到困惑,请随意评论,因为这是我在堆栈上的第一个问题

^(?!(?:^|.*,)([^,\n]*),.*\1(?:,|$)).*$
试试这个。看演示


正则表达式在许多情况下都很有用。但是要检查字符串中的重复项,可以像这样(在C#中)更容易地实现:

工作原理:该函数将字符串转换为列表,修剪元素,然后从中创建第二个不同的列表。最后,它比较两个列表中的元素数量:如果不同列表中的元素少于原始列表,则有重复的元素,并且函数返回true,否则返回false

示例:

var result1=HasDuplicates("Test1, Test1, Test2");
var result2=HasDuplicates("Test1, Test2, Test3");
变量
result1
包含
true
,变量
result2
包含
false
。 您可以在DotNetFiddle中试用该代码:

此功能:

^(?!.*(^|,)([^,]+),.*\2(,|$)).*

请参见

如果是
value1、value2、value2、va-lu4、value6该怎么办
您使用的是什么语言?因为如果表达式没有正确编译,可能会导致很多灾难性的回溯。我目前正在尝试使用
Javascript
,但最终我还想尝试使用类型为
c#/Java
语言的strct。是的,我知道。对于字符串函数,在复杂的字符串操作中使用字符串函数是很容易的,也是很好的实践。但我只是在努力学习,当我尝试的时候,我被这个问题绊倒了。还是谢谢。这很好,而且在很多情况下正则表达式都有优势,这通常是在你寻找复杂模式时——比如IP查找器
((2[0-4]\d | 25[0-5]|[01]?\d\d?){3}(2[0-4]\d | 25[0-5]|[01]?\d\d?
)。顺便说一下,这里有一个很好的30分钟教程,我希望它对你有用。谢谢你的教程。我一定会经历的。再次感谢,谢谢你。你能解释一下这种方法和@vks方法哪个更好吗?为什么?这将帮助我更好地理解正则表达式。谢谢。主要区别在于vks会将一个空白值视为与另一个空白值相匹配,例如,由于捕获组的量词为
*
(零或更多),因此,abc、、def、、ghi被视为具有重复项。Vks还使用非捕获组
(?:…)
,这提供了微不足道的性能优势,但使正则表达式更难阅读。Vks也不会将换行符视为值的一部分,但我认为这与此无关。除此之外,这两个正则表达式非常相似。谢谢你的解释。
^(?!.*(^|,)([^,]+),.*\2(,|$)).*