对于x ='4 [kl]',输出应为'klklklkl' 对于s ='3 [k2 [b]]',输出应为'kbbkbbkbb'
我一直在使用正则表达式select
t1.TitleID,
t1.Version,
t1.CreatedAt,
t2.Version,
t2.CreatedAt
from reviews t1
join reviews t2
on t1.TitleID = t2.TitleID and t1.Version != t2.Version
where
(t1.Version > t2.Version and t1.CreatedAt < t2.CreatedAt)
来查找嵌套括号
.scan(/(\[(?:\[??[^\[]*?\]))/)
答案 0 :(得分:2)
我不确定是否可以在一次传递中完成,但通过递归很容易实现:
%w|4[kl] 3[k2[b]]|.map do |s|
loop do
break s if s.gsub!(/(\d+)\[([^\[\]]+)\]/) { $2 * $1.to_i }.nil?
end
end
#⇒ ["klklklkl", "kbbkbbkbb"]
我们在这里使用String#gsub!
在没有匹配的情况下返回nil
,终止整个循环。
请注意,上面的代码是 destructing ,表示它突变输入。如果您希望原始字符串保持不变,请提前dup
。
答案 1 :(得分:2)
s = '3[k2[b]]'
nil while s.sub!(/(\d+)\[([^\[\]]*)\]/){$2 * $1.to_i}
s #=> "kbbkbbkbb"