Регулярное выражение для каждого вхождения шаблона, которое извлекает всю текстовую строку между = и s

#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. Да, именно так я и знаю. Я тут подумал, есть ли способ считывать значение непосредственно из метасимвола. Спасибо за разъяснение.