Java中的正则表达式

时间:2010-01-21 00:34:46

标签: java

我试图以最优雅的方式剥离和替换文本字符串:

使用解决方案我/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> 

1 个答案:

答案 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)}} }

但这里的问题是你有嵌套。如果你只是简单地匹配括号,你怎么知道匹配多远?你需要你的正则表达式来理解你有多少个开口括号,并找到正确的右括号。对于正则表达式,这不是真的可行。你需要一个函数来解析字符串计数开括号并减去右括号。当你得到零的数量时,你找到了一个集...当然,这不是正则表达式。