2016-03-22 75 views
-2

以下3个正则表达式的主要区别是什么?这三个正则表达式之间的区别是什么

1)/^[^0-9]+$/

2)/[^0-9]+/

3)m/[^0-9]+/

我真的想了解这一点,因为在网上研究并没有帮助我很多,我希望我可以在这里找到一些帮助。

+2

https://metacpan.org/pod/YAPE::Regex::Explain – toolic

回答

3

他们都有[^ 0-9] +,这是一个或多个字符是人数01,...到9

  • 第一个/^[^0-9]+$/锚定在字符串的开始和结尾,因此它将匹配任何只包含非数字的字符串。
  • 第二个/[^0-9]+/未锚定,因此它匹配任何包含至少一个(或多个)非数字的字符串。
  • 第三个m/[^0-9]+/与第二个相同,但明确使用m// match operator

对于一个很好的解释,请regex101.comfirstsecond正则表达式。

+0

它是否考虑到换行符?因为在我看到的一个例子中,当使用'/ [^ 0-9] + /'时,只有数字4的行是匹配的。但是当使用'm/[^ 0-9] + /'并且在同一行使用chop()函数时,只有4行的行不再匹配。 –

+0

我完全不明白你的意思。你为什么不尝试自己?你也可以'使用'重新'调试';'获得更多的解释。 – simbabque

2

正则表达式和以正则表达式为操作数的匹配运算符之间有区别。

您只有两个正则表达式 - ^[^0-9]+$[^0-9]+。选项3使用与选项2相同的正则表达式,但它使用不同版本的匹配运算符。

1和2之间的区别在于1锚定在字符串的开始和结尾,而2根本没有锚定。

所以1表示“匹配字符串的开头,后跟一个或多个非数字,后跟字符串的结尾”。 2表示“在字符串中的任何位置匹配一个或多个非数字”。

这有帮助吗?

+0

2/3是否认为换行符是匹配?因为在我看到的一个例子中,数字“4”在它自己的行上,当使用/ [^ 0-9] + /时,它与该行匹配。但是,当使用chop()函数并删除换行符时,该行不再匹配。 –

+0

你的问题是“换行匹配'[^ 0-9]',那么我会认为测试非常简单 - 'perl -E'say”\ n“=〜/ [^ 0-9]/?“是”:“否”“(打印”是“) –

1

模式[^0-9]是共同的这三个正则表达式,并会匹配任何单个字符十进制数字

  1. /^[^0-9]+$/

    的模式开始,并坚称它包含一个或多个非数字字符

    该回音^是匹配字符串开头的零宽度锚点

    美元符号$也是一个零宽度锚点,它将匹配字符串末尾或换行符之前的换行符,如果换行符是最后在字符串中。因此,这将匹配"aaa""aaa\n"但不"aa7bb\n"

  2. /[^0-9]+/

    这种说法没有锚,所以会返回如果字符串包含至少一个非数字字符的任意位置

    它将匹配"12x345"失败以匹配"12345"。注意,尾随的换行符计数作为一个非数字字符,所以这种模式会匹配"123\n"

  3. m/[^0-9]+/

    这是相同的#2,但与m放置明确。如果您使用默认斜杠作为分隔符,则这是不必要的,但如果您匹配的文件路径模式本身包含斜杠,则可以方便地使用其他模式

    使用m可让您选择您的自己的定界符,例如m{/my/path}代替/\/my\/path/

在本质上,#1被询问是否该字符串全由非数字字符,而#2和#3是相同的,并测试是否字符串包含至少一个非数字字符

+0

2/3认为换行符是匹配吗?因为在我看到的一个例子中,数字“4”在它自己的行上,当使用/ [^ 0-9] + /时,它与该行匹配。但是,当使用chop()函数并删除换行符时,该行不再匹配。 –

+0

@ J.Doe:是的。换行符就像'$'之外的每个正则表达式的其他字符一样。正如我所说的,只要内部有一个非数字,'[^ 0-9] +'就会匹配至少包含一个字符的任何内容。所以它会匹配'“\ n”'很好。当您从文件或终端读取文本行时,您必须* chomp结果,因为换行符会混淆您所做的任何检查。检查一个全数字输入应该是'next,除非/ \ S /而不是/ \ D /',即跳过这​​一行,除非有非空白并且没有非数字 – Borodin