2017-02-04 7 views
2

私はRuby 2.4を使用しています。私は正規表現で特別な意味を持つ文字を含むいくつかの文字列を持っています。したがって、これらの文字が正規表現文字として解釈される可能性を排除するために、私は "Regexp.escape"を使用してそれらをエスケープしようとします。しかし、私はまだどのように適切に、私は正規表現として解釈したいですかwhcih「\ S +」という表現は、とのスペースを代入する前に文字をエスケープすることができRuby式で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 

...正規表現の仕事の下TEHを作ることができないように見えますキャラクター? >a\ b\?\ c、次いでgsuba\\s+b\?\\s+cその結果実行される - Regexp.escape(tokens.join(" ")).gsub(" ", "\\s+")は、tokens.join(" ")収率a b? cを実行した場合

答えて

2

、次に文字列がエスケープされています。今、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) 
関連する問題