带反向引用的正则表达式

4
有人能解释一下在Ruby正则表达式中,反向引用是如何工作的吗?我特别想知道(..)分组是如何工作的。比如:
s = /(..) [cs]\1/.match("The cat sat in the hat")

puts s 

对于上面的代码片段,输出结果是:at sat。为什么/如何会得到这个输出?
2个回答

18

这是这个正则表达式的含义:

regex = /(..) [cs]\1/
#        ├──┘ ├──┘├┘
#        │    │   └─ A reference to whatever was in the first matching group.
#        │    └─ A "character class" matching either "c" or "s".
#        └─ A "matching group" referenced by "\1" containing any two characters.

请注意,在使用匹配组与正则表达式匹配后,特殊变量$1$2等)将包含所匹配的内容。

/(..) [cs]\1/.match('The cat sat in the hat') # => #<MatchData...>
$1 # => "at"

还要注意,Regexp#match方法返回一个MatchData对象,该对象包含引起整个匹配的字符串(即“at sat”,又称为 $&)以及每个匹配组(即“at”,又称为 $1):

/(..) [cs]\1/.match('The cat sat in the hat')
=> #<MatchData "at sat" 1:"at"> 

2
首先,puts s 的输出结果不是捕获组:
s = /(..) [cs]\1/.match("The cat sat in the hat")
puts s
# at sat

如果您想访问其捕获组,您应该使用MatchData.captures

s = /(..) [cs]\1/.match("The cat sat in the hat")
s.captures
# => ["at"]

谢谢您的回答。实际上,我想知道这个分组到底是什么意思? - K M Rakibul Islam
@KMRakibulIslam:.是通配符,可以匹配任何字符,因此(..)是一个捕获组,可以捕获任意两个字符--在您的情况下,它捕获了“at”。 - Christian Severin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接