为什么这种负面看法背后是错误的?

时间:2015-10-19 00:07:19

标签: ruby regex negative-lookbehind

def get_hashtags(post)
    tags = []
    post.scan(/(?<![0-9a-zA-Z])(#+)([a-zA-Z]+)/){|x,y| tags << y}
    tags
end
Test.assert_equals(get_hashtags("two hashs##in middle of word#"), [])
#Expected: [], instead got: ["in"]

如果没有看到匹配不是以单词或数字开头,那么它是否应该落后?为什么它仍然接受&#39;作为有效的匹配?

1 个答案:

答案 0 :(得分:2)

你应该使用\K而不是负面的背后隐藏。这使您可以大大简化正则表达式:不需要预定义的数组,捕获组或块。

\K表示&#34;丢弃到目前为止匹配的所有内容&#34;。这里的关键是可变长度匹配可以在\K之前,而(在Ruby和大多数其他语言中)可变长度匹配不允许在(负面或正面)外观中。

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"]