7

我仍在努力理解 Regex 是如何工作的。

我正在获取用户名,它们采用以下格式:

firstname.lastname

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

我正在使用这个表达式

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

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

我希望有人能解释一下。

谢谢!

4

5 回答 5

11

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

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

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

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

您想使用以下内容:

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

in 正则表达式意味着将+前面所述的 1 匹配到无限次。

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

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

所以我会使用以下内容:

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

正则表达式演示仅使用小写字母

正则表达式演示失败,因为用户名有大写字母

于 2013-07-25T14:51:10.030 回答
4

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

public static bool checkStringForUpperCase(string s) 
{
    for (int i = 0; i < s.Length; i++)
    {
        if (char.IsUpper(s[i]))
            return false;
    }
    return true;
}
于 2013-07-25T14:52:14.800 回答
3

如果要检查是否没有大写,则不需要 dot int 中间,可以使用 just [^A-Z] You should use startand endregex symbols 并表示这可以是多个符号。如果我没记错的话应该是这样的^[^A-Z]*$

于 2013-07-25T14:50:10.380 回答
2

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

于 2019-09-10T18:12:02.373 回答
0

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

  string test = @"Test";
  string test2 = "test";
  bool result = test.Any(x=>char.IsUpper(x));  //true
  result = test2.Any(x => char.IsUpper(x));//false
于 2013-07-25T14:53:37.253 回答