我一直在努力思考这个问题,但是根据我目前的知识找不到解决方案。
我正在尝试检测一个句子中的单词,例如,为了便于说明,在任何位置使用大写字母,其余为小写。
所以HEllo,HellO或heLLo会匹配但Hello或HEllO不会。
答案 0 :(得分:4)
这可以在没有Regex和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();
输出:
2
答案 1 :(得分:3)
或者,如果你想要一个RegEx:)
3个字母的内容相同。您可以将模式计数中的整数更改为您喜欢的任何数字。
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");
}
答案 2 :(得分:2)
此RegEx将起作用
^[a-z]*[A-Z][a-z]*[A-Z][a-z]*$
从字符串的开头,匹配0个或更多小写字母,然后是第一个大写字母,然后是0个或更多个小写字母,然后是第二个大写字母,然后是0个或更多个小写字母。
答案 3 :(得分:1)
我个人认为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);
}
}