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

一致が単語または数字で始まっていないかどうかを確認するために後ろを見るべきではありませんか? 有効な一致として「in」をまだ受け入れているのはなぜですか?

4

1 に答える 1

2

\K否定的な後読みではなく、使用する必要があります。これにより、正規表現を大幅に簡素化できます。事前定義された配列、キャプチャ グループ、またはブロックは必要ありません。

\K「これまでに一致したものをすべて破棄する」ことを意味します。ここで重要なのは\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"] 
于 2015-10-19T05:49:22.637 に答える