我试图以最优雅的方式剥离和替换文本字符串:
使用解决方案我/element\s*\{"([^"]+)"\}\s*{text\s*{\s*}\s*({[^}]*})/
text.replaceAll("element\\s*\\{\"([^\"]+)\"}\\s*\\{text\\s*\\{\\s*}\\s*(\\{[^}]*})", "<$1> $2"));
用于以下文字:
element {"item"} {text { } {$i/child::itemno} text { } {$i/child::description} text { } element {"high_bid"} {{max($b/child::bid)}} text { }}
得到:
<item> {$i/child::itemno} text { } {$i/child::description} text { } element {"high_bid"} {{max($b/child::bid)}} text { }}
当我想要实现时:
<item>{$i/child::itemno}{$i/child::description}<high_bid>{fn:max($b/child::bid)}</high_bid></item>
答案 0 :(得分:2)
审核之后,问题是正则表达式只匹配一次。
您的正则表达式正在寻找元素{“tag”} {text {} {text_here}
这只会在您的输入中出现一次:
element {"item"} {text { } {$i/child::itemno}
没有其他东西匹配:
text { } element {"high_bid"} { => NO MATCH, text without element before it
element {"high_bid"} {{max($b/child::bid)}} text { } => NO MATCH, text after braces
所以要么你的输入不好,要么你需要比一次性正则表达式更好的东西。
话虽如此,我认为正则表达式不会在这里起作用。您可以删除所有“text {}”元素,这些元素似乎无效:
text.replaceAll("text\\s*\\{\\s*}", ""));
这给了你:
element {"item"} { {$i/child::itemno} {$i/child::description} element {"high_bid"} {{max($b/child::bid)}} }
但这里的问题是你有嵌套。如果你只是简单地匹配括号,你怎么知道匹配多远?你需要你的正则表达式来理解你有多少个开口括号,并找到正确的右括号。对于正则表达式,这不是真的可行。你需要一个函数来解析字符串计数开括号并减去右括号。当你得到零的数量时,你找到了一个集...当然,这不是正则表达式。