正则表达式仅限制大写

时间:2013-07-25 14:45:28

标签: c# regex regex-negation

我很难理解Regex的工作原理。

我收到用户名,他们采用以下格式:

firstname.lastname

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

我正在使用此表达式

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

在我看来,这应该有用,我只是不明白为什么不这样做。

我希望有人能解释一下。

谢谢!

5 个答案:

答案 0 :(得分:8)

[^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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

如果你想检查没有大写,你不需要dot int middle,你可以只使用[^A-Z] 您应该使用startend正则表达式符号,并表示这可能超过一个符号。 如果我没记错的话应该是^[^A-Z]*$

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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