为什么RegExp.escape在我的Ruby表达式中不起作用?

为什么RegExp.escape在我的Ruby表达式中不起作用?,ruby,regex,escaping,whitespace,Ruby,Regex,Escaping,Whitespace,我正在使用Ruby 2.4。我有一些字符串,其中包含在正则表达式中具有特殊意义的字符。因此,为了消除这些字符被解释为regexp字符的可能性,我使用“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\

我正在使用Ruby 2.4。我有一些字符串,其中包含在正则表达式中具有特殊意义的字符。因此,为了消除这些字符被解释为regexp字符的可能性,我使用“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+”表达式替换空格之前,我如何正确地转义字符,我希望将其解释为regexp字符?

当执行
regexp.escape(tokens.join(“”).gsub(“”,“\\s+”
)时,
tokens.join(“”
产生
ab?c
,然后字符串被转义->
a\b\?\c
,然后执行
gsub
,结果是
a\\s+b\?\\s+c
。现在,
line
1ab吗?C3
。因此,所有的
\\
现在都匹配一个文本反斜杠,它们不再形成一个特殊的正则表达式元字符来匹配空格

您需要转义令牌,并使用
\s+
连接,或使用空格连接,然后使用
\s+
替换空格:

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

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