我使用的是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 +"替换空格之前正确转义字符。表达,我想要解释为正则表达式字符吗?
答案 0 :(得分:2)
执行Regexp.escape(tokens.join(" ")).gsub(" ", "\\s+")
时,tokens.join(" ")
会产生a b? c
,然后字符串会被转义 - > a\ b\?\ c
,然后执行gsub
,结果为a\\s+b\?\\s+c
。现在,line
为1 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)