正则表达式仅替换模式内部

Chr*_*son 1 ruby regex

我想替换方括号内的所有破折号,但保留那些不是的破折号.

串: dont-change-this[only-change-inside-brackets]

结果: dont-change-this[only_change_inside_brackets]

我目前正在这样做的方法是捕获方括号中的所有内容然后替换.

regex = /(\[([a-z-]+)\])/
testString = "dont-change-this[only-change-inside-brackets]"

testString.match regex
testString.sub(regex, $1.gsub(/-/, '_'))
Run Code Online (Sandbox Code Playgroud)

它有效,但我想知道是否有办法在一个表达式中执行此操作.

hir*_*lau 5

您可以将sub(或gsub)与块一起使用:

my_string.sub(/\[.*?\]/){|x|x.tr('-','_')}
Run Code Online (Sandbox Code Playgroud)