为什么RegExp.escape无法在我的Ruby表达式中工作?

时间:2017-02-04 00:43:10

标签: ruby regex escaping whitespace

我使用的是Ruby 2.4。我有一些字符串包含在正则表达式中具有特殊含义的字符。因此,为了消除这些字符被解释为正则表达式字符的任何可能性,我使用" Regexp.escape"试图逃避他们。但是,我似乎仍然无法在正则表达式工作之下......

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 +"替换空格之前正确转义字符。表达,我想要解释为正则表达式字符吗?

1 个答案:

答案 0 :(得分: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)