C# 检查字符串是否包含特定的字符集?(可能需要重复的字符)
我知道有很多方法可以检查字符串是否包含某些字符,但我正试图找出一种排除重复字母的方法C# 检查字符串是否包含特定的字符集?(可能需要重复的字符),c#,C#,我知道有很多方法可以检查字符串是否包含某些字符,但我正试图找出一种排除重复字母的方法 var expression = new Regex(@"(?<letter>\w).*\k<letter>"); if (expression.IsMatch(userInput)) { Console.WriteLine("Found a duplicate letter: {0}", expression.Match(userInput).Groups["letter"]
var expression = new Regex(@"(?<letter>\w).*\k<letter>");
if (expression.IsMatch(userInput)) {
Console.WriteLine("Found a duplicate letter: {0}", expression.Match(userInput).Groups["letter"].Value);
}
例如,我们有用户输入的字符串doaurid随机字母
然后他们输入单词dad看看它是否有效
我想不出一个简单的解决方案来检查这个字符串是否有2个D和1个a。
我想到的唯一方法是使用嵌套for循环,遍历char数组中的每一个元素,并将使用过的字母转换为1或其他什么。Reed Copsey的方法是正确的。无论如何,LINQ还有另一种选择:
Reed Copsey的观点是正确的。无论如何,LINQ还有另一种选择:
您可以使用:
var userInput = "doaurid";
var toCheck = "dad";
var check = toCheck.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
var input = userInput.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] == g.Value);
仅当userInput字符串包含toCheck中的所有字母,且字母数完全相同时,此选项才有效
如果输入字符串可以允许更多重复的字母,即:如果dddoauriddd应该匹配,则可以通过以下方式进行检查:
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] >= g.Value);
您可以使用:
var userInput = "doaurid";
var toCheck = "dad";
var check = toCheck.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
var input = userInput.GroupBy(c=> c).ToDictionary(g => g.Key, g => g.Count());
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] == g.Value);
仅当userInput字符串包含toCheck中的所有字母,且字母数完全相同时,此选项才有效
如果输入字符串可以允许更多重复字母,即:如果dddoauridddd应该匹配,则可以通过以下方式进行检查:
bool validMatch = check.All(g => input.ContainsKey(g.Key) && input[g.Key] >= g.Value);
一种可能是使用正则表达式。例如,下面的代码将检测提供的字符串是否包含任何重复的字母
var expression = new Regex(@"(?<letter>\w).*\k<letter>");
if (expression.IsMatch(userInput)) {
Console.WriteLine("Found a duplicate letter: {0}", expression.Match(userInput).Groups["letter"].Value);
}
该表达式首先匹配任何单词字符,然后将结果存储在字母组中。然后,它跳过0个或多个其他中间字母,并最终将反向引用与它在字母组中捕获的任何字母进行匹配。如果字符串不包含任何重复的字母,则此正则表达式将不匹配-因此,如果它匹配,则您知道它包含重复的字母,并且通过检查它在字母组中捕获的值,您至少知道其中一个重复的字母
在这种情况下,它将区分大小写。如果希望它不区分大小写,可以将RegexOptions.IgnoreCase参数传递给正则表达式的构造函数。一种可能性是使用正则表达式。例如,下面的代码将检测提供的字符串是否包含任何重复的字母
var expression = new Regex(@"(?<letter>\w).*\k<letter>");
if (expression.IsMatch(userInput)) {
Console.WriteLine("Found a duplicate letter: {0}", expression.Match(userInput).Groups["letter"].Value);
}
该表达式首先匹配任何单词字符,然后将结果存储在字母组中。然后,它跳过0个或多个其他中间字母,并最终将反向引用与它在字母组中捕获的任何字母进行匹配。如果字符串不包含任何重复的字母,则此正则表达式将不匹配-因此,如果它匹配,则您知道它包含重复的字母,并且通过检查它在字母组中捕获的值,您至少知道其中一个重复的字母
在这种情况下,它将区分大小写。如果希望它不区分大小写,可以将RegexOptions.IgnoreCase参数传递给正则表达式的构造函数。另一种方法,使用ToLookup:
另一种方法,使用ToLookup:
我可以想出这样一个更简单的解决办法
var userInput = "dddoauriddd"; //"doaurid";
var toCheck = "dad";
var toCheckR = "";
foreach(var c in toCheck)
{
toCheckR += ".*";
}
Console.WriteLine(Regex.IsMatch(userInput, toCheckR));
我可以想出这样一个更简单的解决办法
var userInput = "dddoauriddd"; //"doaurid";
var toCheck = "dad";
var toCheckR = "";
foreach(var c in toCheck)
{
toCheckR += ".*";
}
Console.WriteLine(Regex.IsMatch(userInput, toCheckR));
@ReedCopsey right:/我看不到大局。我马上就修好。@ReedCopsey这一个还好吧?我认为它应该像您的第一个解决方案一样工作。是的,但如果ddoaurid是匹配的,它将无法处理。@ReedCopsey right:/我看不到全局。我将在一分钟内修复它。@ReedCopsey这一个可以吗?我认为它应该像您的第一个解决方案一样工作。是的,但如果ddoaurid是匹配的,它将无法处理。我不明白我正在试图找出一种排除重复字母的方法。您想检查较大的字符串是否包含与其他字符串计数相同的所有字母,或者您想实现什么?我不明白,我正在试图找出排除重复字母的方法。您想检查较大的字符串是否包含与其他字符串计数相同的所有字母,或者您想实现什么目标?嗯。。如果输入包含三个D,则返回false。不确定这是否是问题所在。@Default不确定-编辑以包括如何使其有效(如果需要)。也不确定:规格有点模糊。但是+1,因为这两种解决方案都包含了Hm。。如果输入包含三个D,则返回false。不确定这是否是问题所在。@Default不确定-编辑以包括如何使其有效(如果需要)。也不确定:规格有点模糊。但是+1,因为这两种解决方案都包括在内