解決方案
如果您對Regexen和插值不是很小心,會出現微小的錯誤。
您需要:
/[[:space:]]+(?:#{Regexp.union(LETTERS).source})$/i
下面是一個例子:
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
如果省略Regexp#source
:
r2 = /[[:space:]]+(?:#{Regexp.union(LETTERS)})$/i
# /[[:space:]]+(?:(?-mix:a|b))$/i
data.grep(r2)
# ["test a"]
注意Regexp.union
區分大小寫。當它被導入到更大的正則表達式時,其標誌也被導入:(a|b)
區分大小寫,因此它不匹配"test A"
。這裏有一個相關主題:Interpolating regexes into another regex
錯誤2
如果省略括號周圍a|b
:
r3 = /[[:space:]]+#{Regexp.union(LETTERS).source}$/i
# /[[:space:]]+a|b$/i
data.grep(r3)
# ["test A", "test a", "testB", "testb"]
空間只會a
之前予以考慮。即使它不應該,"testB"
也會匹配。
謝謝,但這不是我所擁有的。我如何複製「/我」(不區分大小寫匹配)? 「\ s +」與「[[:space:]] +」不一樣「 – Dave
@Dave'\ s +'類似於[[:space:]] +'但你說得對,它們是不一樣。我編輯忽略大小寫。 –
'正則表達式:: IGNORECASE'仍然被內部正則表達式忽略。例如,你的正則表達式不匹配'「test A」'。 –