C# 确保不重复任何字符的正则表达式
我需要确保输入字符串遵循以下规则:C# 确保不重复任何字符的正则表达式,c#,regex,C#,Regex,我需要确保输入字符串遵循以下规则: 它应该只包含大写字符 字符串中不应重复任何字符。 ABCA无效,因为“A”正在重复 对于大写字母,[A-Z]应该可以。 但我不知道如何确保没有重复的字符 有人能推荐一些使用正则表达式的方法吗?这不能通过正则表达式实现,因为它们与上下文无关。您至少需要上下文敏感的语法语言,所以实现这一点的唯一方法是手工编写函数 有关背景理论,请参阅。为什么不检查重复或不使用大写的字符?使用类似于([A-Z])?*([^A-Z]|\1)的东西,您可以使用.NET正则表达式执行
- 它应该只包含大写字符李>
- 字符串中不应重复任何字符。 ABCA无效,因为“A”正在重复
有人能推荐一些使用正则表达式的方法吗?这不能通过正则表达式实现,因为它们与上下文无关。您至少需要上下文敏感的语法语言,所以实现这一点的唯一方法是手工编写函数
有关背景理论,请参阅。为什么不检查重复或不使用大写的字符?使用类似于
([A-Z])?*([^A-Z]|\1)
的东西,您可以使用.NET正则表达式执行此操作,尽管我建议您不要这样做:
string s = "ABCD";
bool result = Regex.IsMatch(s, @"^(?:([A-Z])(?!.*\1))*$");
相反,我建议检查字符串的长度是否与不同字符的数量相同,并分别检查A-Z要求:
bool result = s.Cast<char>().Distinct().Count() == s.Length;
bool result=s.Cast().Distinct().Count()=s.Length;
或者,如果性能是一个关键问题,则逐个迭代字符,并保留所看到的记录。使用反向前瞻和反向引用
string pattern = @"^(?!.*(.).*\1)[A-Z]+$";
string s1 = "ABCDEF";
string s2 = "ABCDAEF";
string s3 = "ABCDEBF";
Console.WriteLine(Regex.IsMatch(s1, pattern));//True
Console.WriteLine(Regex.IsMatch(s2, pattern));//False
Console.WriteLine(Regex.IsMatch(s3, pattern));//False
\1
匹配第一个捕获的组。因此,如果重复任何字符,则反向前瞻将失败。这不是正则表达式,速度会很慢,但您可以创建字符串内容的数组,然后通过比较n到n的数组进行迭代++
=Waldo可以使用回调引用来完成
string pattern = @"^(?!.*(.).*\1)[A-Z]+$";
string s1 = "ABCDEF";
string s2 = "ABCDAEF";
string s3 = "ABCDEBF";
Console.WriteLine(Regex.IsMatch(s1, pattern));//True
Console.WriteLine(Regex.IsMatch(s2, pattern));//False
Console.WriteLine(Regex.IsMatch(s3, pattern));//False
我是一个Java程序,因此我将向您展示如何用Java实现它(对于C#,请参阅)
常规表达式是([A-Z]).\\1
,它转换为介于“A”到“Z”之间的任何内容,作为组1(“([A-Z])”)任何其他内容(.*)和组1
将$1
用于C
希望这有帮助。至少对单个模式没有帮助。它可以,用一个无限长的正则表达式:)是的,因为长度不能大于26,所以这样产生的正则表达式将非常长,我想假设我将反向引用以前的所有组:P@Mark,则它们不是具有有限字母表的正则表达式(因为大写字符是)它是有限的。例如:我们有26个大写字符,每个字符只能出现一次。然后我们有26个!可能有26个字符长的单词,多一些25个字符长的单词等等。最后我们可以构造长(但有限)regexp是所有单词的并集。所以它可以用regexp来完成,但在这种情况下不实用。一些问题可以用非regex的方法很容易解决。这是一个很好的例子。我同意。一个集合和一个循环是一种方法。它可以用regex使用称为反向引用的概念来完成。请看我的答案。我想这也可以达到目的。我该如何做呢在使用正则表达式时?请检查此正则表达式。如果它不匹配,则说明您的条件为真。好的。我尝试了它,但它工作正常。但我最终使用了非正则表达式方法。将此标记为正确答案,因为这是我最终使用的:)