Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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# 为什么这些正则表达式测试允许某些字符通过?_C#_Regex - Fatal编程技术网

C# 为什么这些正则表达式测试允许某些字符通过?

C# 为什么这些正则表达式测试允许某些字符通过?,c#,regex,C#,Regex,我正在使用以下正则表达式检查字符串: [a-zA-Z0-9]+ [A-Za-z]+ 出于某种原因,角色: . - _ 是否允许传递,原因是什么?如果要检查完整字符串是否仅包含正则表达式所需的字符,如下所示: ^[a-zA-Z0-9]+$ 否则,每个字符串都将传递到包含某个允许字符字符串的位置。锚点本质上告诉正则表达式引擎开始在字符串的开头查找这些字符,并停止在字符串的结尾查找 澄清一下:如果您只是使用[a-zA-Z0-9]+作为正则表达式,那么正则表达式引擎将正确地拒绝字符串-\uuu--

我正在使用以下正则表达式检查字符串:

[a-zA-Z0-9]+
[A-Za-z]+
出于某种原因,角色:

.
-
_

是否允许传递,原因是什么?

如果要检查完整字符串是否仅包含正则表达式所需的字符,如下所示:

^[a-zA-Z0-9]+$
否则,每个字符串都将传递到包含某个允许字符字符串的位置。锚点本质上告诉正则表达式引擎开始在字符串的开头查找这些字符,并停止在字符串的结尾查找

澄清一下:如果您只是使用
[a-zA-Z0-9]+
作为正则表达式,那么正则表达式引擎将正确地拒绝字符串
-\uuu--
,因为正则表达式与此不匹配。您定义的字符类中没有单个字符

但是,字符串
a-b
则不同。正则表达式引擎将匹配此处的第一个
a
,因为它匹配您输入的表达式(至少一个给定字符),并且不关心
-
b
。它已经完成了它的工作,并根据正则表达式成功地匹配了一个子字符串

-abcdef-
类似,regex将匹配子字符串
abcdef
,因为您没有告诉它只匹配字符串的开头或结尾;忽略其他角色


因此,当使用
^[a-zA-Z0-9]+$
作为正则表达式时,您明确地告诉正则表达式引擎您正在查找一个或多个字母或数字,从字符串的最开始一直到字符串的结尾。没有空间让其他角色挤进或隐藏,所以这会满足你的需求。但是如果没有锚,匹配可以在搜索字符串中的任何位置。出于验证目的,您始终希望使用这些定位。

在正则表达式中,+告诉引擎匹配一个或多个字符

因此,如果字符串包含一个或多个字母字符的序列,则表达式[A-Za-z]+将传递。唯一无法通过的字符串是完全不包含字母字符的字符串

^symbol将字符类锚定到字符串的开头,$symbol锚定到字符串的结尾

因此^[A-Za-z0-9]+表示“匹配以一个或多个字母数字字符序列开头的字符串”。但允许包含非字母数字的字符串,只要这些字符不在字符串的开头


而^[A-Za-z0-9]+$表示“匹配以一个或多个字母数字字符序列开头和结尾的字符串”。这是从字符串中完全排除非字母数字的唯一方法。

如何检查字符串?您可以发布整个验证代码块吗?您可以使用[^a-zA-Z0-9]对其进行冷还原,并拒绝与以下内容匹配的内容:)但为什么允许使用句点/破折号/下划线?@mrblah:因为
[a-zA-Z0-9]+
仅与该块中的一个或多个字符匹配。因此,如果你不锚定它,只要其中有一个字符,它就会传递regex.to mrblah:把你的表达式读为:从a到z,从a到z,从0到9找到一个或多个符号。因此,如果有任何其他符号-不在乎。^表示您的符号应从开始到结束,在结尾处为$,当您将两者都设置为Johannes时,从开始到结束,不需要任何其他符号。