2017-02-04 82 views
2

我正在使用Ruby 2.4。我有一些字符串包含在正則表達式中有特殊含義的字符。因此,爲了消除這些字符被解釋爲正則表達式字符的可能性,我使用「Regexp.escape」試圖逃脫它們。但是,我似乎仍然無法讓下面的正則表達式的工作格蘭...爲什麼RegExp.escape在我的Ruby表達式中不起作用?

2.4.0 :005 > tokens = ["a", "b?", "c"] 
=> ["a", "b?", "c"] 
2.4.0 :006 > line = "1\ta\tb?\tc\t3" 
=> "1\ta\tb?\tc\t3" 
2.4.0 :009 > /#{Regexp.escape(tokens.join(" ")).gsub(" ", "\\s+")}/.match(line) 
=> nil 

如何正確我用「\ S +」的表情,whcih我確實想解釋爲正則表達式替換空間之前逃脫字符字符?

回答

2

當執行Regexp.escape(tokens.join(" ")).gsub(" ", "\\s+")tokens.join(" ")產量a b? c,則該字符串被轉義 - >a\ b\?\ c,然後gsub執行導致a\\s+b\?\\s+c。現在,line1 a b? c 3。因此,所有\\現在都匹配一個文字反斜槓,它們不再構成匹配空白的特殊正則表達式元字符。

你需要躲避的令牌,並與\s+加入,或者加入空間,後來更換\s+空間:

/#{tokens.map { |n| Regexp.escape(n) }.join("\\s+")}/.match(line) 

OR

/#{tokens.map { |n| Regexp.escape(n) }.join(" ").gsub(" ", "\\s+")}/.match(line) 
相關問題