Я пытаюсь удалить и заменить текстовую строку, которая выглядит следующим образом, самым элегантным способом:
element {"item"} {text {
} {$i/child::itemno}
Чтобы выглядеть как:
<item> {$i/child::itemno}
Следовательно, удаляем текст элемента, подставляя его фигурные скобки и удаляя текст и сопровождающие его фигурные скобки.
Я считаю, что подходящее регулярное выражение для этого:
/element\s*\{"([^"]+)"\}\s*{text\s*{\s*}\s*({[^}]*})/
но я не уверен относительно количества обратных косых черт, которые следует использовать в java, а также о том, как завершить последнюю замену, которая использует мою группу (1), и заменит ее на <в начале и> в конце:
Пока что у меня есть это (хотя, возможно, мне было бы лучше с полной перепиской?)
Pattern p = Pattern.compile("/element\\s*\\{\"([^\"]+)\"\\}\\s*{text\\s*{\\s*}\\s*({[^}]*})/ ");
// Split input with the pattern
Matcher m = p.matcher("element {\"item\"} {text {\n" +
" } {$i/child::itemno} text { \n" +
" } {$i/child::description} text {\n" +
" } element {\"high_bid\"} {{max($b/child::bid)}} text {\n" +
" }} ");
// Далее для каждого экземпляра группы 1 замените его на <> в начале
Я думаю, что наткнулся на проблему. То, что я пытаюсь сделать, несколько сложнее, чем я говорил ранее. С решением у меня есть ниже:
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>