为什么RegExp.escape在我的Ruby表达式中不起作用?
我正在使用Ruby 2.4。我有一些字符串,其中包含在正则表达式中具有特殊意义的字符。因此,为了消除这些字符被解释为regexp字符的可能性,我使用“regexp.escape”尝试对它们进行转义。然而,我似乎仍然无法使下面的正则表达式工作为什么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\
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)