регулярное выражение и замена в Java - PullRequest
2 голосов
/ 20 января 2010

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

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>

1 Ответ

3 голосов
/ 20 января 2010
  1. регулярные выражения Java пишутся без разделителей. Так что потеряйте слэши;
  2. каждому обратному слешу требуется один дополнительный, поэтому \s становится \\s;
  3. все { необходимо экранировать: \\{, а } не нужно убегать (хотя это не помешает, если вы избежите их).

Попытка:

String text = "element {\"item\"} {text { } {$i/child::itemno}";
System.out.println(text.replaceAll("element\\s*\\{\"([^\"]+)\"}\\s*\\{text\\s*\\{\\s*}\\s*(\\{[^}]*})", "<$1> $2"));

Выход:

<item> {$i/child::itemno} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...