Muszę podstawić wartość ciągu w moim wyrażeniu regularnym w Rubim. Czy jest na to łatwy sposób? Na przykład:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Muszę podstawić wartość ciągu w moim wyrażeniu regularnym w Rubim. Czy jest na to łatwy sposób? Na przykład:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Odpowiedzi:
To samo, co wstawianie ciągu.
if goo =~ /#{Regexp.quote(foo)}/
#...
Zauważ, że Regexp.quote
w Jon L. za odpowiedź jest ważna!
if goo =~ /#{Regexp.quote(foo)}/
Jeśli wybierzesz tylko „oczywistą” wersję:
if goo =~ /#{foo}/
wtedy kropki w tekście dopasowania są traktowane jako symbole wieloznaczne wyrażenia regularnego i "0.0.0.0"
będą zgodne "0a0b0c0"
.
Zauważ również, że jeśli naprawdę chcesz tylko sprawdzić dopasowanie podłańcucha, możesz po prostu to zrobić
if goo.include?(foo)
który nie wymaga dodatkowego cytowania ani martwienia się o znaki specjalne.
.quote()
) może być również przydatna, jeśli chcesz skonstruować wyrażenie regularne za pomocą ciągu.
if goo.include?(foo)
" => True, gdy chcesz sprawdzić istnienie. Jeśli jesteś zainteresowany zastąpieniem i już korzystaniem z String.gsub, wówczas Regexp.quote może być jedyną opcją.
Regexp.new
lub Regexp.compile
.
Regexp.compile(Regexp.escape(foo))
Użyj Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Oto ograniczona, ale użyteczna inna odpowiedź:
Odkryłem, że mogę łatwo wstawić do wyrażenia regularnego bez użycia Regexp.quote lub Regexp.escape, jeśli użyłem tylko apostrofów w moim ciągu wejściowym: (pasujący adres IP)
IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0")
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"
pojedyncze cudzysłowy interpretują tylko znaki \\ i \ '.
http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes
Pomogło mi to, gdy musiałem kilkakrotnie użyć tej samej długiej części wyrażenia regularnego. Nie uniwersalne, ale moim zdaniem pasuje do przykładu pytania.
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/