Regex 这三个正则表达式之间有什么区别
以下3个正则表达式之间的主要区别是什么 1)Regex 这三个正则表达式之间有什么区别,regex,perl,Regex,Perl,以下3个正则表达式之间的主要区别是什么 1) /^[^0-9]+$/ 2) /[^0-9]+/ 3) m/[^0-9]+/ 我真的很想了解这一点,因为在线调查对我帮助不大,我希望我能在这里找到一些帮助 它们都有[^0-9]+,这是一个或多个字符,不是数字0,1。。。至9 第一个/^[^0-9]+$/锚定在字符串的开头和结尾,因此它将匹配任何只包含非数字的字符串 第二个/[^0-9]+/未锚定,因此它与包含至少一个(或多个)非数字的任何字符串匹配 第三个m/[^0-9]+/与第二个相同,但显式使
/^[^0-9]+$/
2) /[^0-9]+/
3) m/[^0-9]+/
我真的很想了解这一点,因为在线调查对我帮助不大,我希望我能在这里找到一些帮助 它们都有[^0-9]+,这是一个或多个字符,不是数字
0
,1
。。。至9
- 第一个
锚定在字符串的开头和结尾,因此它将匹配任何只包含非数字的字符串/^[^0-9]+$/
- 第二个
未锚定,因此它与包含至少一个(或多个)非数字的任何字符串匹配/[^0-9]+/
- 第三个
与第二个相同,但显式使用m/[^0-9]+/
要获得更好的解释,请查看和正则表达式。正则表达式和以正则表达式作为其操作数的匹配运算符之间存在差异 那里只有两个正则表达式-
^[^0-9]+$
和[^0-9]+
。选项3使用与选项2相同的正则表达式,但它使用不同版本的匹配运算符
1和2之间的区别在于,1被锚定在字符串的起点和终点,而2根本不被锚定
因此1表示“匹配字符串的开头,后跟一个或多个非数字,后跟字符串的结尾”。2表示“匹配字符串中任意位置的一个或多个非数字”
这有帮助吗?模式
[^0-9]
对于这三个正则表达式是通用的,它将匹配任何非十进制数字的单个字符
/^[^0-9]+$/
这将模式锚定到字符串的开头和结尾,并坚持它包含一个或多个非数字字符
扬抑符^
是一个零宽度锚定符,与字符串开头匹配
美元符号$
也是一个零宽度锚定符,它将匹配字符串的末尾,或者如果该换行符是字符串中的最后一个换行符,则在换行符之前匹配。因此,这将匹配“aaa”
和“aaa\n”
,但不匹配“aa7bb\n”
/[^0-9]+/
它没有锚定,因此如果字符串在任何位置至少包含一个非数字字符,则返回true
它将匹配“12x345”
,但不匹配“12345”
。请注意,尾随换行符计为非数字字符,因此此模式将匹配“123\n”
m/[^0-9]+/
这与#2相同,但显式放置了m
。如果使用默认的斜杠作为分隔符,则不需要这样做,但是如果要为文件路径(例如,文件路径本身包含斜杠)匹配模式,则可以方便地使用不同的内容
使用m
可以选择自己的分隔符,例如m{/my/path}
而不是/\/my\/path/
本质上,#1询问字符串是否完全由非数字字符组成,而#2和#3相同,并测试字符串是否包含至少一个非数字字符是否考虑换行符?因为在我看到的一个例子中,当使用
/[^0-9]+/
时,一行上只有数字4是匹配的。但是当使用m/[^0-9]+/
并且在同一行上使用chop()函数时,上面只有4个的行就不再匹配了。我不完全理解你的意思。你为什么不自己试试呢?你也可以做使用re'debug'代码>以得到额外的解释。2/3是否认为换行符是匹配的?因为在我看到的一个例子中,数字“4”在它自己的行上,当使用/[^0-9]+/时,它与该行匹配。但是当使用chop()函数并删除换行符时,该行不再匹配。@J.Doe:Yes。除了$
之外,换行符与每个正则表达式构造的任何其他字符一样。正如我所说,[^0-9]+
将匹配任何至少包含一个字符的内容,只要其中有一个非数字。因此它将匹配“\n”
很好。当您从文件或终端读取文本行时,必须chomp
,因为换行符会混淆您所做的任何检查。检查一个全数字的输入应该是<代码>下一个,除非/s///\/\d/</代码>,即跳过这一行,除非有非空白,并且没有非数字2/3,认为换行符是匹配的。因为在我看到的一个例子中,数字“4”在它自己的行上,当使用/[^0-9]+/时,它与该行匹配。但是当使用chop()函数并删除换行符时,换行符不再匹配。如果您的问题是“换行符是否匹配[^0-9]
,那么我会认为这是非常简单的测试-perl-E'say“\n”=~/[^0-9]/?“Yes”:“no”
(打印“Yes”)