#java #regex
#java #регулярное выражение
Вопрос:
Я создаю программу, которая переформатирует XML-файл.
например; Ниже приведен фрагмент XML.
<ServiceRequest actionCode=KK
addedWithoutItinerary=false airlineCode=1S
code=ADTK orderNumber=1 serviceCount=1
serviceType=SSR ssrType=AFX>
Я хочу заключить все значения атрибутов в двойные кавычки.
например;
<ServiceRequest actionCode="KK"
addedWithoutItinerary="false" airlineCode="1S"
code="ADTK" orderNumber="1" serviceCount="1"
serviceType="SSR" ssrType="AFX">
Следовательно, я пытаюсь написать шаблон регулярных выражений, который может служить этой цели.
Я хочу извлечь все текстовые строки между = и одним символом пробела («s»), например «=false», «=1S» и так далее.
Я попробовал этот шаблон
private static final Pattern ATTR_PATTERN = Pattern.compile("(?<==)(.*)(?= |\n)");
но этот шаблон группирует все тексты, которые имеют конечный символ как пробел.
например;
KK
addedWithoutItinerary=false airlineCode=1S
code=ADTK orderNumber=1 serviceCount=1
serviceType=SSR
Есть предложения?
Комментарии:
1. Используйте анализатор XML вместо регулярного выражения
2. Этот XML содержит множество символов спецификации и множество ненужных строк, сгенерированных из журналов. Синтаксический анализатор здесь мало поможет.
3. Связанный вопрос не кажется обманчивым, поскольку он касается
location
только одного атрибута, а не общего решения, которое ищет OP.
Ответ №1:
Вы можете выполнять поиск с помощью этого регулярного выражения:
=([^s"<>] )
И замените с помощью ="$1"
Демонстрация регулярных выражений
Java-код:
String repl = xml.replaceAll("=([^\s"<>] )", "="$1"");
Подробности регулярного выражения:
=
: Сопоставить=
([^s"<>] )
: Сопоставьте 1 любого символа, который не является пробелом,"
,<
и>'
и зафиксируйте его в группе #1="$1"
это заменяющая часть, которая помещает=
и фиксирует значение в двойные кавычки.
Комментарии:
1. Но это извлечет точное слово без знака = . Пожалуйста, подскажите, не ошибаюсь ли я здесь. (?<==)([^ s»<>] ) Ссылка: regexr.com/5go7f
2. Да, просмотр назад также будет работать так, как вы предлагаете
3. Привет @anubhava не могли бы вы подсказать, как прочитать значение $1? например; if(«$1».equals(«некоторое значение»)) { //Сделай что-нибудь … }
4. Если вам нужно значение
$1
отдельно, вам нужно будет использоватьPattern and Matcher
, а затем использоватьmatcher.group(1)
. Вы можете проверить пример кода Java по ссылке regex101, которую я опубликовал в своем ответе.5. Да, именно так я и знаю. Я тут подумал, есть ли способ считывать значение непосредственно из метасимвола. Спасибо за разъяснение.