【问题标题】:Regex to avoid data duplication in delimited string?正则表达式避免分隔字符串中的数据重复?
【发布时间】:2015-04-29 19:07:41
【问题描述】:

我正在尝试验证将以, 分隔的string 值的数据。我想要验证 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 函数和循环来做到这一点,我正在学习 Regex 并想尝试是否可以使用正则表达式。如有疑问,请随时发表评论,因为这是我在 Stack 上的第一个问题。

【问题讨论】:

  • 您使用的是什么语言?因为如果表达式编译不正确,可能会导致大量灾难性的回溯。
  • 我目前正在尝试使用Javascript,但最终我也想尝试使用c#/Java 语言类型的strct。

标签: regex regex-lookarounds regex-greedy


【解决方案1】:

这行得通:

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

demo

【讨论】:

  • 谢谢。你能解释一下这个或@vks 哪个方法更好吗?为什么?这将帮助我更好地理解正则表达式。谢谢。
  • 主要区别在于vks会将一个空白值视为匹配另一个空白,例如abc,,def,,ghi被视为具有重复项,因为捕获组具有*的量词(或更多)。 Vks 还使用非捕获组(?:...),它提供了微不足道的性能优势,但恕我直言,使正则表达式更难阅读。Vks 也不会将换行符视为值的一部分,但我认为这不是很相关。除了这些点之外,这两个正则表达式非常相似。
  • 感谢您的解释。
【解决方案2】:

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

bool HasDuplicates(string str)
{
    var list1=str.Split(',').Select(s=>s.Trim());
    var list2=list1.Distinct();
    return (list1.Count()>list2.Count());
}

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

示例:

var result1=HasDuplicates("Test1, Test1, Test2");
var result2=HasDuplicates("Test1, Test2, Test3");

变量result1 包含true,变量result2 包含false。 您可以在 DotNetFiddle 中试用代码:https://dotnetfiddle.net/0pRURH

【讨论】:

  • 是的,我知道。使用字符串函数很容易,并且在复杂的字符串操作时使用字符串函数是一种很好的做法。但我只是想学习,在尝试时我偶然发现了这个问题。还是谢谢。
  • 没关系,RegEx 在很多情况下都有优势,通常是在您寻找复杂模式时——例如 IP finder ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。对了,有一个不错的30分钟教程here,希望对你有用。
  • 感谢您的教程。我一定会经历的。再次感谢。
【解决方案3】:
^(?!(?:^|.*,)([^,\n]*),.*\1(?:,|$)).*$

试试这个。查看演示。

https://regex101.com/r/wU7sQ0/24

【讨论】:

  • 如果是value1,value2,value2,va-lu4,value 6会怎样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2016-04-24
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多