为什么 %r{ around } 我的 Regex 会破坏我的 gsub?

Jon*_*han 1 ruby regex gsub

今天下午 Rubocop 把我拉过来,因为我没有将我的正则表达式文字包装在 %r{} 中。但它随后继续破坏我的 gsub。为什么?

path = '/en/something'
# "/en/something"
locale = 'en'
# "en"
path.gsub(/\A\/#{locale}\/?/, '/')
# "/something" <---- Expected
path.gsub(%r{/\A\/#{locale}\/?/}, '/')
# "/en/something" <---- Unexpected
Run Code Online (Sandbox Code Playgroud)

spi*_*ann 5

Ruby 允许您以%r您选择的分隔符开始您的正则表达式。当您描述的模式包含大量正斜杠字符时,这很有用,因为这些斜杠不需要在该语法中进行转义。

因此/\A\/#{locale}\/?/%r{/\A\/#{locale}\/?/}不相等,%r{\A/#{locale}/?}改用。

r = /\A\/#{locale}\/?/

r == %r{/\A\/#{locale}\/?/}
#=> false
r == %r{\A/#{locale}/?}
#=> true
Run Code Online (Sandbox Code Playgroud)