Регулярное выражение в Java - PullRequest
0 голосов
/ 21 января 2010

Я пытаюсь удалить и заменить текстовую строку самым элегантным способом:

С решением у меня есть /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 Ответ

2 голосов
/ 21 января 2010

После просмотра проблема в том, что регулярное выражение совпадает только один раз.

Ваше регулярное выражение ищет элемент {"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)}} }

Но проблема здесь в том, что у вас есть вложение. Если вы просто сопоставляете фигурные скобки, как вы узнаете, как далеко нужно сопоставить? Вам нужно ваше регулярное выражение, чтобы понять, сколько у вас открывающих скобок, и найти правильную закрывающую скобку. Это не совсем выполнимо с регулярными выражениями. Вам нужна функция, которая анализирует строку, считая открывающие скобки и вычитая закрывающие скобки. Когда вы получаете счетчик нуля, вы нашли множество ... Конечно, это не регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...