如何\ 1在perl正则表达式中工作?

时间:2018-04-29 14:55:56

标签: regex perl

我试图匹配字符串(某些东西)。

$_ = "anna is ann";
if (/([a-zA-Z]+) is \1/) {
    print "matched\n";
}

我希望这不起作用,但它有效。为什么呢?

2 个答案:

答案 0 :(得分:4)

尝试print $1;print $&; - /([a-zA-Z]+) is \1/a is a的{​​{1}}子字符串匹配。如果您想限制匹配,您可能希望使用anna is ann resp锚定到字符串(或/m下的行)的开头和/或结尾。 ^,如果您想在更长的字符串中匹配,请使用边界\b。所以:

/^([a-zA-Z]+) is \1$/将与$匹配,但不会与"anna is anna""anna is ann"匹配。

/\b([a-zA-Z]+) is \1\b/将与"anna is anna ""x anna is anna y"匹配,但不会与"sue-ann is ann-marie""anna is ann""anna is anne"匹配。

答案 1 :(得分:3)

它匹配从pos 3(a is a)开始的6个字符。也许你应该使用

/^([a-zA-Z]+) is \1\z/
  1. 开始一个位置0。
    1. [a-zA-Z]+匹配位置0的4个字符。
      1. is 匹配位置4的4个字符。
      2. \1在pos 8:Backtrack上不匹配。
    2. [a-zA-Z]+匹配位置0的3个字符。
      1. is 在pos 3处不匹配:Backtrack。
    3. [a-zA-Z]+匹配位置0的2个字符。
      1. is 在pos 2处不匹配:Backtrack。
    4. [a-zA-Z]+匹配位置0的1个字符。
      1. is 在第1位:Backtrack不匹配。
  2. 开始发布1。
    1. [a-zA-Z]+匹配位置1的3个字符。
      1. is 匹配位置4的4个字符。
      2. \1在pos 8:Backtrack上不匹配。
    2. [a-zA-Z]+匹配位置1的2个字符。
      1. is 在pos 3处不匹配:Backtrack。
    3. [a-zA-Z]+匹配位置1的1个字符。
      1. is 在pos 2处不匹配:Backtrack。
  3. 开始发布2。
    1. [a-zA-Z]+匹配位置2的2个字符。
      1. is 匹配位置4的4个字符。
      2. \1在pos 8:Backtrack上不匹配。
    2. [a-zA-Z]+匹配位置2的1个字符。
      1. is 在pos 3处不匹配:Backtrack。
  4. 开始发布3。
    1. [a-zA-Z]+匹配位置3的1个字符。
      1. is 匹配位置4的4个字符。
      2. \1匹配位置8的1个字符。
      3. 匹配! (6个字符从pos 3开始)