Ruby正则表达式有一些选项(例如i,x,m,o)。例如,i 表示忽略大小写。
o 选项是什么意思?在 ri Regexp
中,它说 o 意味着只进行一次 #{}
插值。但是当我使用以下代码时:
a = 'one'
b = /#{a}/
a = 'two'
b
没有改变(它仍然是/one/
)。我错过了什么吗?
Translated:
b
没有改变(它仍然是/one/
)。我错过了什么吗?
来自正则表达式的权威指南:
/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
所以我猜这更适合编译器,针对执行多次的单行代码。
b = /#{a}/
这段代码执行后,b
被赋值为 /one/
,也就是说,“o”标志与此无关。 - Liao Pengyu
o
标志。你为什么期望它会有任何效果呢? - sawao
标志表示开启效果,那么我认为在正则表达式中的#{}
可能会在没有标志的情况下每次执行。 - Liao Pengyuo
修饰符。因此,在 Perl 中,o
标志似乎具有与 Ruby 不同的含义,并且此外 Perl 标志可能已损坏。 - Rhubbarb