2016-10-25 15 views
0

私はパターンのリストを持っていますが、それらのパターンに対して文字列を一致させたいのですが、単語全体を一致させる必要があるので、単語境界をRegexp.unionに動的に挿入する方法を探していました私は何かが欠けている。 は、ここで私が試したもの単語境界を持つ正規表現の結合

test_string = "lonewolf is lonely" 
pattern_list = ["lonely", "wolf", "jungle"] 
pattern_list.collect! { |pattern| pattern = "\b" + pattern + "\b"} 
patterncollection = Regexp.union(pattern_list) 
puts patterncollection 
puts test_string.scan(patterncollection) 

結果が空になっていると私は、パターンのコレクションを印刷する場合、私は「\ bは」正しくエスケープされないことがわかります。 "\ b"をリストに直接挿入することはできません。そのリストは動的に取得されます。 私は複数のオプションを試しましたが、まだ運がありません。 問題に対するさまざまなアプローチが歓迎されます。

答えて

2

最も簡単な解決策は、労働組合の外の単語境界のmatcherを移動するには、次のようになります。

/\b(#{Regexp.union(pattern_list).source})\b/ 

▶ "lonewolf is lonely".scan /\b(#{Regexp.union(%w|lonely wolf jungle|).source})\b/ 
#⇒ [ 
# [0] [ 
#  [0] "lonely" 
# ] 
# ] 

は、以下の重要なコメントを参照してください。基本的には、あなたが何が起こるかを知っていれば、絶対に肯定的でない限り、「ソースを使用する」ことが示唆されます。 - ティン・マン "

私はそれに応じて回答を更新しました。

+0

パーフェクト!ありがとうございました! – Jack

+0

'Regexp.union'を使用する場合など、正規表現を正規表現に埋め込むことに注意してください。 [/ FO#{Reinxp.union(['O'、 'B'])}/mix] #=> nil'しかし '' foo ' '、' B '])。source}/mix] #=> "foo" '何が起こるのか分かっていない限り、 'source'を使用してください。 –

+0

@theTinManありがとう、私は答えを更新しました。この特定の入力に問題はありませんが、コーナーケースについて言及する価値はあると私は完全に同意します。 – mudasobwa

関連する問題