Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保不重复任何字符的正则表达式_C#_Regex - Fatal编程技术网

C# 确保不重复任何字符的正则表达式

C# 确保不重复任何字符的正则表达式,c#,regex,C#,Regex,我需要确保输入字符串遵循以下规则: 它应该只包含大写字符 字符串中不应重复任何字符。 ABCA无效,因为“A”正在重复 对于大写字母,[A-Z]应该可以。 但我不知道如何确保没有重复的字符 有人能推荐一些使用正则表达式的方法吗?这不能通过正则表达式实现,因为它们与上下文无关。您至少需要上下文敏感的语法语言,所以实现这一点的唯一方法是手工编写函数 有关背景理论,请参阅。为什么不检查重复或不使用大写的字符?使用类似于([A-Z])?*([^A-Z]|\1)的东西,您可以使用.NET正则表达式执行

我需要确保输入字符串遵循以下规则:

  • 它应该只包含大写字符
  • 字符串中不应重复任何字符。 ABCA无效,因为“A”正在重复
对于大写字母,[A-Z]应该可以。 但我不知道如何确保没有重复的字符


有人能推荐一些使用正则表达式的方法吗?

这不能通过正则表达式实现,因为它们与上下文无关。您至少需要上下文敏感的语法语言,所以实现这一点的唯一方法是手工编写函数


有关背景理论,请参阅。

为什么不检查重复或不使用大写的字符?使用类似于
([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使用称为反向引用的概念来完成。请看我的答案。我想这也可以达到目的。我该如何做呢在使用正则表达式时?请检查此正则表达式。如果它不匹配,则说明您的条件为真。好的。我尝试了它,但它工作正常。但我最终使用了非正则表达式方法。将此标记为正确答案,因为这是我最终使用的:)