你如何只更换下面表达式中括号之间的x,同时仍然保留空格和其他字母:
{ x} x {abc x efg} x x {} { x{x}{ x} }
与Replace nested expressions using Ruby不同,因为括号内有括号。
答案 0 :(得分:0)
最简单的方法(使用正则表达式)是匹配最外面的括号表达式,然后在替换回调中替换x
:
> '{ x} x {abc x efg} x x {} { x{x}{ x} }'.gsub(/\{(?:[^{}]|\g<0>)*\}/) {|s| s.gsub('x', 'y')}
=> "{ y} x {abc y efg} x x {} { y{y}{ y} }"
这个解决方案的核心是在这个正则表达式中匹配最外面的括号表达式:
/\{(?:[^{}]|\g<0>)*\}/
暂时离开\g<0>
分支,我们有\{(?:[^{}])*\}
。这将匹配{
后跟任意数量的字符,而不是{
或}
,然后是}
。
\g<0>
将递归到整个表达式本身。这增加了{
和}
之间的可能性,它可以包含任意数量的括号表达式,而这些表达式又可以包含非括号字符和更多括号表达式。
上面的正则表达式将匹配字符串中的{ x}
,{abc x efg}
,{}
,{ x{x}{ x} }
,然后您可以在替换回调中替换这些x
。
我不确定,但我认为如果没有替换回调,无论如何都要做到这一点。即使有,也不是一个实际的解决方案。