2017-03-26 9 views
1

Ruby 2.4を使用しています。私は正規表現を作成するには、配列内に出現する文字の後ろに任意の数の空白をマッチさせます。だから私はこの別の正規表現でRegexp.unionを使用するにはどうすればよいですか?

LETTERS = ["a", "b"] 
# => ["a", "b"] 
data = ["asdf f", "sdfsdf x"] 
# => ["asdf f", "sdfsdf x"] 
data.grep(/(^|[[:space:]]+)[#{Regexp.union(LETTERS)}]$/i) 
# => ["asdf f", "sdfsdf x"] 

を試みたが、あなたが見ることができるように、どちらのトークンは、私の配列の文字で終わるという事実にもかかわらず、両方のトークンが一致なっています。これを説明するために正規表現を書き直すにはどうすればよいですか?

答えて

1

ソリューション

Regexp.new("[[:space:]]+(#{Regexp.union(LETTERS).source})", Regexp::IGNORECASE) 

あなたは、この正規表現を使用できます。

LETTERS = ["a","b"] 
#=> ["a","b"] 
regex = Regexp.new("[[:space:]]+#{Regexp.union(LETTERS)}", Regexp::IGNORECASE) 
#=> /[[:space:]]+(?-mix:a|b)/i 
data = ["asdf f", "sdfsdf x"] 
#=> ["asdf f", "sdfsdf x"] 
data.grep(regex) 
#=> [] 
data = ["asdf f", "sdfsdf a"] 
#=> ["asdf f", "sdfsdf a"] 
data.grep(regex) 
#=> ["sdfsdf a"] 

をしかし、最も内側の正規表現は、大文字小文字を無視しません。 @ EricDuminilのソリューションのおかげで、間違いを見やすくなりました。あなたはRegexenと補間と非常に注意しないなら

+0

ありがとうございますが、これは私が持っていたものと全く同じではありません。どのように "/ i"(大文字のinsenstivieの一致)を複製するのですか?また、「\ s +」は「[[:space:]] +「 – Dave

+0

」と同じではありません@Dave '\ s +'は '[[:space:]] +'と似ていますが、同じではありません。私は大文字小文字を無視するように編集しました。 –

+0

'Regexp :: IGNORECASE'は内部の正規表現によってまだ無視されます。あなたの正規表現は、例えば '' test A ''にマッチしません。 –

2

ソリューション

微妙なバグが表示されます。

あなたが必要とする:あなたがRegexp#sourceを省略した場合

LETTERS = %w(a b).freeze 
data = ['asdf f', 'sdfsdf x', 'test A', 'test a', 'testB', 'testb'] 
r = /[[:space:]]+(?:#{Regexp.union(LETTERS).source})$/i 
# /[[:space:]]+(?:a|b)$/i 
data.grep(r) 
# ["test A", "test a"] 

バグ1

/[[:space:]]+(?:#{Regexp.union(LETTERS).source})$/i 

は、ここでの例です

r2 = /[[:space:]]+(?:#{Regexp.union(LETTERS)})$/i 
# /[[:space:]]+(?:(?-mix:a|b))$/i 
data.grep(r2) 
# ["test a"] 

注こと10は大文字と小文字を区別それが大きな正規表現にインポートされると、そのフラグもインポートされます:(a|b)は大文字と小文字を区別するため、"test A"と一致しません。あなたの周りa|b括弧を省略した場合Interpolating regexes into another regex

バグ2

r3 = /[[:space:]]+#{Regexp.union(LETTERS).source}$/i 
# /[[:space:]]+a|b$/i 
data.grep(r3) 
# ["test A", "test a", "testB", "testb"] 

スペースのみa前に考慮されます。ここに関連するスレッドです。 "testB"は一致しなくても一致します。

関連する問題