0

我需要正则表达式来验证文本中所有单词的文本必须是唯一的。例如我的文字会像

有效文本-> “高级|付费|常规|下一个”

无效文本-> “Advance|Paid|Paid|Regular|Next|Advance”

话是不能解决的,它可以是任何事情。

请帮助我如何在.net中实现它

4

5 回答 5

3

我不认为你可以用正则表达式来实现这一点,除非单词列表是明确已知的(比如在枚举中)。

但是,在 .Net 中,您可以通过多种其他方式非常轻松地做到这一点。

对于初学者,让我们试试 C# 和 Linq:

using System;
using System.Linq;

string myText = "aaa|bbb|ccc|aaa";
var parts = myText.Split('|');
var uniques = parts.Distinct();
if(uniques.Count() != parts.Length) throw new ArgumentException("Not unique!");
于 2012-09-01T10:09:48.970 回答
2

我不确定.net,但是一个正则表达式会找到一个单词,然后是另一个匹配的单词:

\b(\w+)\b.*\b\1\b

也就是说,一个分词符、一个单词字符序列、一个分词符、任意数量的任何字符(换行符除外),然后重复这个词,并在其周围加上分词符。

并非所有正则表达式引擎都允许 \1 引用同一正则表达式中的先前匹配项。

于 2012-09-01T10:11:17.683 回答
1

这对 LinQ 来说很简单

string curText = "Advance|Paid|Paid|Regular|Next|Advance";
string valid = string.Join("|", curText.Split('|').Distinct());
if(valid.Length != curText.Length)  
    // error.....
于 2012-09-01T10:12:40.167 回答
0

是的,可以使用反向引用:

(?:^|\|)([a-z]+)\|.+\|\1(?:\||$)

这将匹配具有重复单词的表达式,并将单词的第一个实例作为一个组。要么否定它以查看单词是否重复,或者使用替换来删除单词。

要使用空格而不是|

\b([a-z]+)\b.+\b\1\b
于 2012-09-01T10:57:15.073 回答
0

为什么要为此使用 RegEx?只需检查输入中字符串 X 的出现次数并检查它是否最多为 1。在您的示例中拆分为“|” 应该很容易(可以通过 RegEx 完成,但简单地标记字符串应该更容易)。

于 2012-09-01T10:09:18.470 回答