我需要正则表达式来验证文本中所有单词的文本必须是唯一的。例如我的文字会像
有效文本-> “高级|付费|常规|下一个”
无效文本-> “Advance|Paid|Paid|Regular|Next|Advance”
话是不能解决的,它可以是任何事情。
请帮助我如何在.net中实现它
我不认为你可以用正则表达式来实现这一点,除非单词列表是明确已知的(比如在枚举中)。
但是,在 .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!");
我不确定.net,但是一个正则表达式会找到一个单词,然后是另一个匹配的单词:
\b(\w+)\b.*\b\1\b
也就是说,一个分词符、一个单词字符序列、一个分词符、任意数量的任何字符(换行符除外),然后重复这个词,并在其周围加上分词符。
并非所有正则表达式引擎都允许 \1 引用同一正则表达式中的先前匹配项。
这对 LinQ 来说很简单
string curText = "Advance|Paid|Paid|Regular|Next|Advance";
string valid = string.Join("|", curText.Split('|').Distinct());
if(valid.Length != curText.Length)
// error.....
是的,可以使用反向引用:
(?:^|\|)([a-z]+)\|.+\|\1(?:\||$)
这将匹配具有重复单词的表达式,并将单词的第一个实例作为一个组。要么否定它以查看单词是否重复,或者使用替换来删除单词。
要使用空格而不是|
:
\b([a-z]+)\b.+\b\1\b
为什么要为此使用 RegEx?只需检查输入中字符串 X 的出现次数并检查它是否最多为 1。在您的示例中拆分为“|” 应该很容易(可以通过 RegEx 完成,但简单地标记字符串应该更容易)。