Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式*[^a-zA-Z0-9.];_C#_Regex - Fatal编程技术网

C# 正则表达式*[^a-zA-Z0-9.];

C# 正则表达式*[^a-zA-Z0-9.];,c#,regex,C#,Regex,当我试图阅读更多关于C#中正则表达式的内容时,我只想确定我得出的结论。 对于下面的表达式“*[^a-zA-Z0-9_239;].*”,开头和结尾的“*”是无用的,对吗?因为据我所知,“*”表示任何字符的出现次数为零或更多,但后跟“[^a-zA-Z0-9\”,表示除不区分大小写的字母和数字组合以外的任何字符,使得“*”无法在“[^a-zA-Z0-9\”之前和之后添加,对吗 下面是我用来检查表达式是否匹配的代码 // Here we call Regex.Match. Match match = R

当我试图阅读更多关于C#中正则表达式的内容时,我只想确定我得出的结论。 对于下面的表达式“*[^a-zA-Z0-9_239;].*”,开头和结尾的“*”是无用的,对吗?因为据我所知,“*”表示任何字符的出现次数为零或更多,但后跟“[^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");

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

该正则表达式匹配所有以any字符开头,后跟
a-zA-Z0-9
且以any字符结尾的字符串。或者只是一个根本不包含
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)
如果您离开
*
,那么您只有一个与字符匹配的正则表达式,该字符根本不包含
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)

唯一的区别是“边距字符”是否包含在结果中

用于:

ab41--_71j

它将匹配:

1--\u 7

如果开头和结尾没有
*
,它将匹配:

--

只要至少有一个字符不是a-zA-Z0-9,任何字符串都将至少与正则表达式匹配一次_

根据您目前在回答中的最后一条评论,我理解您实际上使用了:

^[a-zA-Z0-9]*$

仅当所有字符都是数字/字母时,此选项才匹配。 如果不匹配,则字符串无效

如果您还希望允许使用
\uuu
字符,请使用:

^[a-zA-Z0-9\]*$

甚至可以缩短为:

^\w$

一般来说,最好使正则表达式的字符串有效,而不是使字符串无效。它只是更有意义,更直观

因此,我的验证将如下所示:

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");
}
如果你不想把“_uu”包括在内,它甚至可以看起来更好

if ("anytest#".ToCharArray().All(char.IsLetterOrDigit))
{
    Console.WriteLine("Success");
}
else
{
    Console.WriteLine("Error");
}

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

input 1:
ABCßu ABC

输入2:
ß

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

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

用于输入1

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


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

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

您真正想要匹配什么?我正在尝试检查用户是否放置字母和数字以外的任何字符。但是我正在测试这个regx“*[^a-zA-Z0-9\].*”因为它是由其他开发人员提供给我的,与您提供的代码示例没有区别(假设您不再需要提供代码之外的
match
)。没有
*
可能会在不知不觉中加快速度,但如果您担心速度,那么您可以在不使用正则表达式的情况下实现同样的效果。那么“*[^a-zA-Z0-9\].*”与“[^a-zA-Z0-9\]”有何不同呢?你能给我举个例子吗实际上“ABCßßABC”和“ß”在我测试时都会匹配它们都会匹配第一个正则表达式,但不会匹配第二个正则表达式<代码>[^a-zA-Z0-9\]只匹配一个字符。hmmm。。。您是否尝试了我在问题中使用的代码,是否使用了相同的代码进行检查?我需要确保“[^a-z a-Z0-9.]”和“*[^a-z a-Z0-9.]”提供相同的输出。而且--uu与它们都匹配--它们并不总是匹配。只有当字符串的第一个和最后一个字符都不是a-z或a-z或0-9或u时,它们才会给出相同的输出,因为如果它们是,它们将出现在后一个字符中,但不会出现在前一个字符中。@imad请参阅“编辑”,以了解我认为您应该使用什么来确保所有字符都是字母或数字。谢谢您的建议Yorye,但我正试图研究这个表达式。*[^a-zA-Z0-9.].*,因为它是别人给我的developer@imad对你来说,这没关系。唯一的区别在于匹配的值:
*
将是整个无效字符串,但如果没有它,则只会是使其无效的子字符串。您能否给我一个匹配的示例。*[^a-zA-Z0-9.].*但不匹配[^a-zA-Z0-9.]否。我只能给您一个匹配部分不同的示例。输入将包含与这两个表达式都匹配的部分,或者两者都不匹配。因此,这两个表达式的输出是相同的?对于您提供的代码,是相同的。但是,如果要检查
match
变量的一些其他属性(例如
Value
),您将开始看到差异。