2

当我试图阅读更多关于 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");
4

5 回答 5

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");
}
于 2012-06-03T06:26:18.380 回答
2

.*[^a-zA-Z0-9_].*只要输入中的某处有非字母数字/下划线,它将匹配整个输入。[^a-zA-Z0-9_]如果它位于输入中的某个位置,则将仅匹配单个非字母数字/下划线字符(很可能是最后一个字符,如果您使用的是默认贪婪匹配)。您想要哪一个取决于输入以及您在确定输入中是否存在非字母数字/下划线字符后要执行的操作。

于 2012-06-03T06:33:20.847 回答
1

a-Z不,因为除了and之外还有其他字符0-9

该正则表达式匹配所有以任何字符开头的字符串,而不是以任何a-zA-Z0-9字符结尾的字符串。或者只是一个根本不包含的字符串 。a-zA-Z0-9

如果你离开,.*那么你只有一个匹配一个完全不包含的字符的正则表达式 a-zA-Z0-9

.*[^a-zA-Z0-9_].*  matches for instance: ABC_ß_ABC
[^a-zA-Z0-9_]      matches for instance: ß   (and this regex just matches 1 character)
于 2012-06-03T06:18:42.147 回答
1

输入 1:ABC_ß_ABC

输入 2:ß

正则表达式 1:.*[^a-zA-Z0-9_].* 正则表达式 2:[^a-zA-Z0-9_]

两个输入都匹配正则表达式,

对于输入 1

正则表达式 1 匹配 9 个字符

正则表达式 2 仅匹配 1 个字符

于 2012-06-03T06:55:48.680 回答
1

仅在您实际查找的正则表达式中包含那些标记。在您的情况下,您实际上并不关心您指定的排除字符类之前或之后是否有任何其他字符。在此之前和之后添加.*不会改变匹配的成功,但会使匹配更加复杂。正则表达式已经匹配任何地方,除非您以某种方式特别锚定它,例如^在开始时使用。

于 2012-06-03T09:49:40.187 回答