检测具有正好X个大写字母的单词

时间:2014-01-16 04:49:02

标签: c# regex match

我一直在努力思考这个问题,但是根据我目前的知识找不到解决方案。

我正在尝试检测一个句子中的单词,例如,为了便于说明,在任何位置使用大写字母,其余为小写。

所以HEllo,HellO或heLLo会匹配但Hello或HEllO不会。

4 个答案:

答案 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.IsUpperSystem.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);
    }
}