我正在编写一个函数,它可以有两种潜在的输入形式:
This is {a {string}}
This {is} a {string}
我称用大括号括起来的子字符串为“标签”。我可能在一个字符串中有任意数量的标签,并且它们可以嵌套任意深度。
我尝试编写一个正则表达式来抓取标签,这当然在嵌套标签上失败了,grabbing {a {string}
,缺少第二个花括号。我可以将其视为一个递归问题,但是在盯着错误答案太久之后,我觉得我看不到真正明显的东西。
我可以做些什么来将潜在的标签分成多个部分,以便可以处理和替换它们?
更复杂的版本
def parseTags( oBody, szText )
if szText.match(/\{(.*)\}/)
szText.scan(/\{(.*)\}/) do |outers|
outers.each do |blah|
if blah.match(/(.*)\}(.*)\{(.*)/)
blah.scan(/(.*)\}(.*)\{(.*)/) do |inners|
inners.each do |tags|
szText = szText.sub("\{#{tags}\}", parseTags( oBody, tags ))
end
end
else
szText = szText.sub("\{#{blah}\}", parseTags( oBody, blah ))
end
end
end
end
if szText.match(/(\w+)\.(\w+)(?:\.([A-Za-z0-9.\[\]": ]*))/)
func = $1+"_"+$2
begin
szSub = self.send func, oBody, $3
rescue Exception=>e
szSub = "{Error: Function #{$1}_#{$2} not found}"
$stdout.puts "DynamicIO Error Encountered: #{e}"
end
szText = szText.sub("#{$1}.#{$2}#{$3!=nil ? "."+$3 : ""}", szSub)
end
return szText
end
这是修修补补太久的结果。它不干净,但它确实适用于类似于“1”的情况 -{help.divider.red.sys.["{pc.login}"]}
替换为---------------[ Duwnel ]---------------
. 然而,{pc.attr.str.dotmode} {ansi.col.red}|{ansi.col.reset} {pc.attr.pre.dotmode} {ansi.col.red}|{ansi.col.reset} {pc.attr.int.dotmode}
内爆非常出色,随机出现红色条纹和缺失文本的样本。
解释一下,任何标记{ansi.col.red}
的东西都会标记 ansi red 代码,reset 会转义色块,并{pc.attr.XXX.dotmode}
在“o”中显示 1 到 10 之间的数字。