你应该使用\K
而不是消极的lookbehind。这使您可以大大简化您的正则表达式:不需要预定义的数组、捕获组或块。
\K
意思是“丢弃到目前为止匹配的所有东西”。这里的关键是可变长度匹配可以在 之前\K
,而(在 Ruby 和大多数其他语言中)可变长度匹配在(负或正)lookbehinds 中是不允许的。
r = /
[^0-9a-zA-Z#] # do not match any character in the character class
\#+ # match one or more pound signs
\K # discard everything matched so far
[a-zA-Z]+ # match one or more letters
/x # extended mode
如果我没有在扩展模式下编写正则表达式,则不需要转义注释#
。\#+
"two hashs##in middle of word#".scan r
#=> []
"two hashs&#in middle of word#".scan r
#=> ["in"]
"two hashs#in middle of word&#abc of another word.###def ".scan r
#=> ["abc", "def"]