заменив регулярное выражение в строке Java, которая содержит символ `& # xA;` - PullRequest
0 голосов
/ 01 февраля 2009

Я должен заменить содержимое этой строки XML через Java

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>

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

<My:tag>value_1 22
value_2 54
value_3 11</My:tag>

Если я попытаюсь заменить содержимое следующим образом:

String regex =  "(<My:tag>)(.*)(</My:tag>)";
String new_string = old_string.replaceAll(regex,"<My:tag> new_stuff </My:tag>");

Я не получил результата. Я думаю из-за символа &#xA;

но если я попытаюсь заменить строку без символа &#xA;, все пойдет хорошо.

Предложения? Спасибо

Ответы [ 3 ]

1 голос
/ 01 февраля 2009

Я не уверен на 100%, как работает java regex-engine, но я не могу себе представить, что сущность вызовет ваши проблемы. Сначала вы должны попытаться просто снять скобки, так как вы заменяете все выражение, а не извлекаете ничего.

Хотя это может быть причиной того, что ваша сущность фактически переведена на новую строку, может случиться так, что ваше регулярное выражение не поймает ее, если вы явно не выполняете многострочное сопоставление. Вы также можете попробовать сделать

[.\n]*

вместо вашего

.*

Хотя это может быть жадная заявка и обратный ход для того, с кем справиться. К сожалению, у меня нет java-программ, установленных на этой машине, поэтому я не могу попробовать и протестировать их. Еще одна возможность - активно искать следующую угловую скобку, например:

[^<]* 

EDIT:
Как вы и предложили, я попробовал вашу ссылку, и следующее работало отлично:

Выражение:

<My:tag>[^<]*</My:tag>

Замена:

<My:tag> new_stuff </My:tag>

Тестовая строка:

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>
1 голос
/ 01 февраля 2009

Я не могу понять, почему сам &#xA; вызвал бы какую-либо проблему - нет, если в какой-то момент он не преобразуется в фактический символ новой строки.

Если это так, вам нужно включить режим DOTALL, чтобы. также соответствует символу новой строки (чего по умолчанию нет).

Чтобы включить DOTALL, просто запустите выражение с (?s)
(если вы создали объект Pattern, вы также можете передать ему флаг.)

В любом случае, попробуйте это:

String regex =  "(?s)(?<=<(My:tag)>).*?(?=</\1>)";
String new_string = old_string.replaceAll(regex,"new_stuff");


Вы также можете включить его для определенной части регулярного выражения с помощью (?s: сегмента регулярного выражения ), например:

String regex =  "(?<=<(My:tag)>)(?s:.*?)(?=</\1>)";
0 голосов
/ 01 февраля 2009

Я бы предложил использовать XML-библиотеку, например JDOM или DOM4J , для манипулирования XML вместо использования регулярных выражений.

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