我很难理解Regex的工作原理。
我收到用户名,他们采用以下格式:
firstname.lastname
两个名称都可能包含特殊的国际字符,它们可能包含'或 - 但我只需要检测它们是否包含任何大写字母,这样我就可以抛出异常。
我正在使用此表达式
[^A-Z].[^A-Z]
在我看来,这应该有用,我只是不明白为什么不这样做。
我希望有人能解释一下。
谢谢!
答案 0 :(得分:8)
[^A-Z]
简单地表示任何不是资本A到资本Z的角色。
.
表示您应该使用的任何字符\.
因为这意味着字面字符.
字符组为[]
,反之为[^]
,然后您可以放置要匹配的字符。
但是,你的正则表达式看起来只匹配一个不是大写字母的单个字符,然后是任何字符,然后是另一个不是大写字母的单个字符
您想使用以下内容:
[^A-Z]+\.[^A-Z]+
正则表达式中的+
表示将前面提到的1与无限时间匹配。
如果您只有这个文本而没有其他文本,则应该包含行的开头和行尾标记,以使它与包含您提到的格式的长字符串不匹配。
但是,你的正则表达式也匹配空格和制表符。
所以我会使用以下内容:
^[^A-Z\s]+\.[^A-Z\s]+$
答案 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]
您应该使用start
和end
正则表达式符号,并表示这可能超过一个符号。
如果我没记错的话应该是^[^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]
以外的其他大写字母。