C# 检测正好包含X个大写字母的单词
我一直在努力思考这个问题,但用我目前的知识找不到解决办法 我试着在一个句子中发现一些单词,它们在任何位置都有大写字母,剩下的是小写字母,比如说2 所以HEllo、HEllo或HEllo会匹配,但HEllo或HEllo不会匹配。这个正则表达式可以工作C# 检测正好包含X个大写字母的单词,c#,regex,match,C#,Regex,Match,我一直在努力思考这个问题,但用我目前的知识找不到解决办法 我试着在一个句子中发现一些单词,它们在任何位置都有大写字母,剩下的是小写字母,比如说2 所以HEllo、HEllo或HEllo会匹配,但HEllo或HEllo不会匹配。这个正则表达式可以工作 ^[a-z]*[A-Z][a-z]*[A-Z][a-z]*$ 从字符串开始,匹配0个或多个小写字母,然后是第一个大写字母,然后是0个或多个小写字母,然后是第二个大写字母,然后是0个或多个小写字母。这可以在不使用正则表达式和Lambda的情况下完成,
^[a-z]*[A-Z][a-z]*[A-Z][a-z]*$
从字符串开始,匹配0个或多个小写字母,然后是第一个大写字母,然后是0个或多个小写字母,然后是第二个大写字母,然后是0个或多个小写字母。这可以在不使用正则表达式和Lambda的情况下完成,读起来非常好
string sentence = "This IS a SEntence";
var wordCount = sentence.Split(new char[] { ' ' })
.Where(word => word.Count(letter => char.IsUpper(letter)) == 2)
.Count();
Console.WriteLine(wordCount );
Console.ReadKey();
输出:
二,
我个人认为,
Char.IsUpper
和System.Linq
的组合将实现一个更优雅和可维护的解决方案-
public static class Word
{
public static bool HasUppercaseLetter(string word, int howManyUpper = 1)
{
return word.Count(char.IsUpper) == howManyUpper;
}
public static int HowManyWordsHaveUppercaseLetters(string sentence,
int howManyUpper = 1)
{
var words = sentence.Split(new[] {' '});
return words.Count(w => HasUppercaseLetter(w, howManyUpper));
}
}
此外,这里还有一些单元测试来证明前面提到的函数对您的示例输入有效
[TestFixture]
public class WordTests
{
[TestCase("HellO", Result = true)]
[TestCase("heLLo", Result = true)]
[TestCase("HEllO", Result = false)]
[TestCase("Hello,", Result = false)]
public bool HasTwoUppercaseLetters(string word)
{
return Word.HasUppercaseLetter(word, 2);
}
[Test]
public void HasTwoWordsWithTwoUppercaseLetters()
{
// Inpsired by Erik Philips
Assert.True(
Word.HowManyWordsHaveUpperCaseLetters("This IS a SEntence", 2) == 2);
}
}
或者,如果需要正则表达式:)
这三个字母都一样。您可以将模式计数中的整数更改为您喜欢的任何数字
string strTester = "AaaaAA";
var results = System.Text.RegularExpressions.Regex.Matches(strTester,"(.*[A-Z]{1}.*){3,}");
var occuranceCount = results.Count;
if (occuranceCount >= 1 ) {
Console.WriteLine("true");
}
else {
Console.WriteLine("false");
}
我会使用一个简单的for循环来代替RegEx。我没有想过用这种方式编写我的RegEx,在根据我的特定需要修改它之后(
有点太大),它成功了。Fourtheye的解决方案也会起作用,但在某些情况下,模式长度可能会变得有点太长。而选择正则表达式主要是因为我已经尝试了一段时间来提高它,最终得到了一个项目,在那里我得到了许多不同的匹配问题要解决。很高兴它有帮助!我也喜欢RegEx,有点“老派”。对于数据验证来说,它仍然非常强大。我必须指出lambda的东西很酷…我在.Net上已经落后了一点。