соответствие двойной кавычки через цитату против шаблона - PullRequest
1 голос
/ 26 июня 2019

Почему check_char1 не может найти двойную кавычку?

#!/usr/bin/env ruby

line = 'hello, "bob"'

def check_char1(line, _char)
    puts "check_char1 found #{_char} in #{line}" if line =~ /_char/
end

check_char1(line, '"')

def check_char2(line, _char)
    puts "check_char2 found #{_char.inspect} in #{line}" if line =~ _char
end

check_char2(line, /"/)

... и можно ли заставить работать line =~ /_char/? (Как двойная кавычка должна быть передана методу?)

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Если _char - это просто строка (т. Е. Не требуется сопоставление с регулярным выражением), тогда просто используйте String#include?

if line.include?(_char)

Если вы должны использовать для этого регулярное выражение, то Regexp.escape ваш друг:

if line =~ /#{Regexp.escape(_char)}/
if line =~ Regexp.new(Regexp.escape(_char))

и если вы хотите, чтобы к _char относились как к регулярному выражению (т. Е. '.' соответствует чему угодно), тогда отбросьте Regexp.escape:

if line =~ /#{_char}/
if line =~ Regexp.new(_char)
2 голосов
/ 26 июня 2019

В check_char1, _char в /_char/ трактуется как литерал, а не как переменная. Вам нужно /#{_char}/.

Если _char обрабатывать как переменную, как можно ввести литерал в регулярное выражение, которое было именем переменной, метода или константы?

...