我试图匹配字符串(某些东西)。
$_ = "anna is ann";
if (/([a-zA-Z]+) is \1/) {
print "matched\n";
}
我希望这不起作用,但它有效。为什么呢?
答案 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/
[a-zA-Z]+
匹配位置0的4个字符。
is
匹配位置4的4个字符。\1
在pos 8:Backtrack上不匹配。[a-zA-Z]+
匹配位置0的3个字符。
is
在pos 3处不匹配:Backtrack。[a-zA-Z]+
匹配位置0的2个字符。
is
在pos 2处不匹配:Backtrack。[a-zA-Z]+
匹配位置0的1个字符。
is
在第1位:Backtrack不匹配。[a-zA-Z]+
匹配位置1的3个字符。
is
匹配位置4的4个字符。\1
在pos 8:Backtrack上不匹配。[a-zA-Z]+
匹配位置1的2个字符。
is
在pos 3处不匹配:Backtrack。[a-zA-Z]+
匹配位置1的1个字符。
is
在pos 2处不匹配:Backtrack。[a-zA-Z]+
匹配位置2的2个字符。
is
匹配位置4的4个字符。\1
在pos 8:Backtrack上不匹配。[a-zA-Z]+
匹配位置2的1个字符。
is
在pos 3处不匹配:Backtrack。[a-zA-Z]+
匹配位置3的1个字符。
is
匹配位置4的4个字符。\1
匹配位置8的1个字符。