Что означает модификатор o для регулярного выражения?
В Ruby regexp есть несколько опций (например, i
, x
, m
, o
). i
означает игнорировать регистр, например.
Что это o
вариант значит? В ri Regexp
это говорит o
значит выполнить #{}
интерполяция только один раз. Но когда я делаю это:
a = 'one'
b = /#{a}/
a = 'two'
b
не меняется (остается /one/
). Что мне не хватает?
1 ответ
Решение
Прямо из источника для регулярных выражений:
/o
вызывает какие-либо#{...}
замены в определенном литерале регулярного выражения должны выполняться только один раз, при первом вычислении. В противном случае подстановки будут выполняться каждый раз, когда литерал генерирует объект Regexp.
Я мог бы также включить этот пример использования:
# avoid interpolating patterns like this if the pattern
# isn't going to change:
pattern = ARGV.shift
ARGF.each do |line|
print line if line =~ /#{pattern}/
end
# the above creates a new regex each iteration. Instead,
# use the /o modifier so the regex is compiled only once
pattern = ARGV.shift
ARGF.each do |line|
print line if line =~ /#{pattern}/o
end
Так что я думаю, что это скорее вещь для компилятора, для одной строки, которая выполняется несколько раз.