【问题标题】:Regex to restrict UPPERCASE only正则表达式仅限制大写
【发布时间】:2013-07-25 12:58:39
【问题描述】:

我仍在努力理解 Regex 的工作原理。

我正在获取用户名,它们的格式如下:

firstname.lastname

这两个名称都可能包含特殊的国际字符,并且可能包含一个 ' 或 - 但我只需要检测它们是否包含任何大写字母,这样我就可以抛出异常。

我正在使用这个表达式

[^A-Z].[^A-Z]

在我看来这应该可行,但我只是不明白为什么它不可行。

希望有人能解释一下。

谢谢!

【问题讨论】:

  • 你可以放弃正则表达式并简单地使用if(yourString.Any(char.IsUpper)) {...}
  • 你应该照@w0lf所说的去做
  • 我正在尝试使用正则表达式进行所有验证,因为在某些情况下我必须使用正则表达式并且我还需要学习它:)
  • [^A-Z] 只匹配 1 个字符而不是大写,就像上面所说的 '.'实际上匹配除换行符以外的任何字符。你可能想逃避它'\。'

标签: c# regex regex-negation


【解决方案1】:

[^A-Z] 仅表示不是大写 A 到大写 Z 的任何字符。

. 表示您应该使用的任何字符 \. 因为这表示文字字符 .

一个字符组是[],反之是[^],然后输入你想匹配的字符。

但是,您的正则表达式看起来只会匹配一个不是大写字母的单个字符,然后是任何字符,然后是另一个不是大写字母的单个字符

您想使用以下内容:

[^A-Z]+\.[^A-Z]+

正则表达式中的+ 表示匹配前面所述的 1 到无限次。

如果您只拥有此文本而没有其他文本,则应包括行首和行尾标记,以便它不匹配包含您提到的格式的长字符串。

但是,您的正则表达式也匹配空格和制表符。

所以我会使用以下内容:

^[^A-Z\s]+\.[^A-Z\s]+$

Regex Demo working with only lowercase

Regex Demo failing because username has uppercase letter

【讨论】:

  • 差不多,加你提到的转义\.
  • 大声笑,信不信由你,我有一个\。但是 标签成功了。
  • 我不得不使用 \\.和 \\s,这是 C# 的事情吗?如果我使用单个 \ 它会抱怨,但它适用于我拥有的一个小测试用例
  • @user2247823 是或者你可以这样做 @"^[^AZ\s]+\.[^AZ\s]+$" 允许转义字符而不转义 \ 是转义字符C#。这就是为什么你需要 \\ 保持这样的状态
  • @user2247823 如果您在字符串中使用\,那么它可能会抱怨无法识别escape sequence。使用 \\ 告诉 C# 编译器你想要一个 literal \ 在你的字符串中。
【解决方案2】:

您可以使用此方法来检查大写字符,而不是使用正则表达式。

public static bool checkStringForUpperCase(string s) 
{
    for (int i = 0; i < s.Length; i++)
    {
        if (char.IsUpper(s[i]))
            return false;
    }
    return true;
}

【讨论】:

  • 不知道为什么当我只是提供一种替代解决方案时会被否决
  • 我看到的唯一问题是它除了大写之外不做任何验证。所以它甚至不检查中间的句点,并且允许空格,因为空格不是大写。
  • 确实如此,尽管您也可以使用 string.contains 查看是否包含在字符串中。
  • 这只会验证一个或多个句点是否在字符串中的任何位置。
【解决方案3】:

如果你想检查没有大写,你不需要点 int 中间,你可以使用 [^A-Z] 您应该使用startend 正则表达式符号并表明这可以是多个符号。 如果我没记错的话应该是^[^A-Z]*$

【讨论】:

    【解决方案4】:

    显然,唯一正确的答案是使用\p{Lu} 来匹配一个大写的Unicode 字母。除了[A-Z],国家字母表中还有其他大写字母。

    【讨论】:

      【解决方案5】:

      如果你只想检查它是否包含大写。试试这个。

        string test = @"Test";
        string test2 = "test";
        bool result = test.Any(x=>char.IsUpper(x));  //true
        result = test2.Any(x => char.IsUpper(x));//false
      

      【讨论】:

      • @downvoter 你能评论一下你为什么投反对票吗?答案有什么问题?
      • 我没有投反对票,但你的代码可以工作吗! char.IsUpper 应该是 x=&gt;char.IsUpper(x)..Aksi @ 是不必要的..
      • 我看到的唯一问题是它除了大写之外不做任何验证。所以它甚至不检查中间的句点,并且允许空格,因为空格不是大写。
      • @abc123 同意。这就是为什么我写“如果你只想检查它是否包含大写”
      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多