Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 检测正好包含X个大写字母的单词_C#_Regex_Match - Fatal编程技术网

C# 检测正好包含X个大写字母的单词

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的情况下完成,

我一直在努力思考这个问题,但用我目前的知识找不到解决办法

我试着在一个句子中发现一些单词,它们在任何位置都有大写字母,剩下的是小写字母,比如说2

所以HEllo、HEllo或HEllo会匹配,但HEllo或HEllo不会匹配。

这个正则表达式可以工作

^[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上已经落后了一点。