当我试图在C#中阅读更多有关正则表达式的内容时,我只想确定我的结论。 对于下面的表达式“。* [^ a-zA-Z0-9 _]。*”,开头和结尾的“。*”都没用,是吗?因为据我所知,“。*”表示任何字符出现零次或多次,但后跟“[^ a-zA-Z0-9_]”,表示除字母和数字的任何组合以外的任何字符不区分大小写,使“。*”无法在“[^ a-zA-Z0-9_]”之前和之后添加,是吗?
以下是我用来检查表达式是否匹配的代码
// Here we call Regex.Match.
Match match = Regex.Match("anytest#", ".*[^a-z A-Z0-9_].*");
//Match match = Regex.Match("anytest#", "[^a-z A-Z0-9_]");
// Here we check the Match instance.
if (match.Success)
Console.WriteLine("error");
else
Console.WriteLine("no error");
答案 0 :(得分:2)
唯一的区别是“边缘字符”是否包含在结果中。
有关:
ab41--_71j
它将匹配:
1--_7
如果开头和结尾没有.*
,它将匹配:
--_
任何字符串都会与.*[^a-zA-Z0-9_].*
正则表达式匹配至少一次,只要它至少有一个字符不是a-zA-Z0-9 _
根据您在答案中的最新评论,我了解您确实使用了:
^[a-zA-Z0-9]*$
仅当所有字符都是数字/字母时才会匹配。 如果不匹配,则该字符串无效。
如果您还想允许_
字符,请使用:
^[a-zA-Z0-9_]*$
甚至可以缩短为:
^\w$
通常,最好使用正则表达式的Validate而不是Invalidate字符串。它更有意义,更直观。
所以我的验证看起来像是:
if (Regex.IsMatch("anytest#", "^\\w$"))
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Error");
}
另一种可能更快的选择:
if ("anytest#".ToCharArray().All(c => char.IsLetterOrDigit(c) || c == '_'))
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Error");
}
如果你不想要包含'_',它甚至可以看起来更好;
if ("anytest#".ToCharArray().All(char.IsLetterOrDigit))
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Error");
}
答案 1 :(得分:1)
不,因为还有其他字符而不是a-Z
和0-9
。
该正则表达式匹配以任何字符开头的所有字符串,而不是a-zA-Z0-9
,而是以任何字符结尾。或者只是一个完全不包含a-zA-Z0-9
的字符串。
如果您离开.*
,那么您只需要一个与不包含a-zA-Z0-9
的charatcer匹配的正则表达式。
.*[^a-zA-Z0-9_].* matches for instance: ABC_ß_ABC
[^a-zA-Z0-9_] matches for instance: ß (and this regex just matches 1 character)
答案 2 :(得分:1)
.*[^a-zA-Z0-9_].*
将匹配整个输入。 [^a-zA-Z0-9_]
只匹配一个非字母数字/下划线字符(如果你使用默认的贪婪匹配,最可能是最后一个),如果它在输入中的某个位置。您想要哪一个取决于输入以及您在查看输入中是否存在非字母数字/下划线字符时要执行的操作。
答案 3 :(得分:1)
输入1:ABC_ß_ABC
输入2:ß
正则表达式1:.*[^a-zA-Z0-9_].*
正则表达式2:[^a-zA-Z0-9_]
两个输入都匹配正则表达式,
输入1
正则表达式1匹配9个字符
Regex 2仅匹配1个字符
答案 4 :(得分:1)
只包含您正在寻找的正则表达式中的那些令牌。在您的情况下,您实际上并不关心在指定的排除字符类之前或之后是否存在任何其他字符。在此之前和之后添加.*
不会改变匹配的成功,但会使匹配更复杂。正则表达式已在任何地方匹配,除非您以某种方式特定地锚定它,例如在开始时使用^
。