这三个正则表达式之间的差异是什么?

时间:2016-03-22 12:55:14

标签: regex perl

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

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

2)/[^0-9]+/

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

我真的想要理解这一点,因为在线研究对我没什么帮助,我希望我能在这里找到一些帮助。

3 个答案:

答案 0 :(得分:3)

所有这些都有[^ 0-9] +,这是一个或多个字符数字01,...到{ {1}}。

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

要获得更好的解释,请查看regex101.comfirst正则表达式的second

答案 1 :(得分:2)

正则表达式和匹配运算符之间存在差异,该运算符将正则表达式作为其操作数。

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

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

所以1说"匹配字符串的开头,后跟一个或多个非数字,然后是字符串的结尾"。 2表示"匹配字符串中的一个或多个非数字"。

这有帮助吗?

答案 2 :(得分:1)

模式[^0-9]对于这三个正则表达式是通用的,并且将匹配十进制数字的任何单个字符

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

    将模式锚定到字符串的开头和结尾,并坚持它包含一个或多个非数字字符

    抑扬符^是一个零宽度的锚点,匹配字符串的开头

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

  2. /[^0-9]+/

    这没有锚点,如果字符串在任何地方包含至少一个非数字字符,则返回 true

    它将匹配"12x345"失败以匹配"12345"。请注意,尾随换行符会计为非数字字符,因此此模式将与"123\n"匹配

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

    这与#2相同,但明确放置了m。如果你使用分隔符的默认斜杠,这是不必要的,但是如果你匹配一个模式,例如一个文件路径,它本身包含斜杠,那么使用不同的东西会很方便

    使用m可让您选择自己的分隔符,例如m{/my/path}而不是/\/my\/path/

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