【问题标题】:Detect if a string contains uppercase characters检测字符串是否包含大写字符
【发布时间】:2013-11-17 15:26:12
【问题描述】:

除了使用正则表达式来检测字符串是否包含大写字符之外,还有其他方法吗?目前我正在使用以下正则表达式:

Regex.IsMatch(fullUri, "[A-Z]") 

它工作得很好,但我经常听到一句老话“如果你使用正则表达式,你现在有两个问题”。

【问题讨论】:

  • 您可以将字符串与其小写等效项进行比较
  • @johny:这比简单地在字符串中查找第一个大写字符要多得多……
  • @Johny,这可行,但它会在内存中创建第二个字符串并进行字符串比较。在这种情况下使用正则表达式或迭代字符串可能是性能方面更好的方法......

标签: c# regex string


【解决方案1】:

你可以使用 LINQ:

fullUri.Any(char.IsUpper);

【讨论】:

    【解决方案2】:

    RegEx 似乎有点矫枉过正:

    bool containsAtLeastOneUppercase = fullUri.Any(char.IsUpper);
    

    【讨论】:

      【解决方案3】:

      使用 Linq!

      fullUri.Any(c=> char.IsUpper(c));
      

      【讨论】:

        【解决方案4】:

        你也可以这样做(如果你想要在 .NET 1.0 中工作的东西:):

        bool hasUpperCase = !fullUri.ToLower().Equals(fullUri);
        

        虽然这个简单的正则表达式可能会很好用

        【讨论】:

          【解决方案5】:

          您的正则表达式只能找到 ASCII 大写字母。方便的是,.NET 正则表达式引擎是 Unicode 感知的,使您能够做到

          Regex.IsMatch(fullUri, @"\p{Lu}") 
          

          虽然我认为在您的情况下,您的字符串中不会出现非 ASCII 字母(考虑到它的名称)。

          【讨论】:

          • 如何回答“是否有替代使用正则表达式”的问题?
          • 我可以确定我的所有路径都不会包含非 ascii 字符,但对其他人绝对有用!
          • @MartinSmith:嗯,是的,你是对的。我一直在思考“如何改进这行代码?”,所以这并不是问题的真正答案(但无论如何可能值得考虑,所以我会留下它以防有人感兴趣)。
          【解决方案6】:

          使用 for 循环,不像其他方法指出的那样高效和可读,但对于初学者来说应该可以工作并提供一种全面的方法:

          int counter = 0;
          for(int i=0; i< myString.Length;i++)
              {
                  //if character is upper add +1 to counter
                  if(char.IsUpper(chaineNonPascale[i]))
                  {
                      counter++;
                  }
              }
          

          基本上,你遍历你的字符串并检查大写字符,然后你可以添加关于如何处理有大写字符的地方的逻辑。例如,在找到第二个大写字符的位置插入一个空格,然后对整个字符串使用 ToLower 方法...

          【讨论】:

            【解决方案7】:

            使用大字符串时,使用 LINQ 可能会对性能产生影响。您还可以使用 ASCII 级别比较。

            byte[] asciiBytes = Encoding.ASCII.GetBytes(fullUri);
            for (int i = 0; i < asciiBytes.Length; i++)
            {
                if (asciiBytes[i] > 64 && asciiBytes[i] < 91)
                {
                    return true;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2016-11-11
              • 2015-07-18
              • 1970-01-01
              • 2011-03-31
              • 2016-03-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-01
              相关资源
              最近更新 更多