Как заменить пробелы на n в java?

#java #regex

Вопрос:

В настоящее время у

 <?xml version="1.0" encoding="ISO-8859-1"?>  <entity>  <id>8624</id>  <name>Test_Report.csv</name>  <startDate>24/05/2021 9:15 am</startDate>  <level>info</level>  </entity>
 

Я сделал:

 message = messsage.replaceAll("\s ","\n")
 

Это дает мне:

 <?xml version="1.0"nencoding="ISO-8859-1"?>n<entity>n<id>8624</id>n  <name>Test_Report.csv</name>n<startDate>24/05/2021n9:15 am</startDate>n<level>info</level>n </entity>
 

Я хочу, чтобы выходные данные сохраняли пробелы в данных xml-элементов нетронутыми и выглядели так, как показано ниже:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<entity>
<id>8624</id>
<name>Test_Report.csv</name>
<startDate>24/05/2021 9:15 am</startDate>
<level>info</level>
</entity>
 

Комментарии:

1. хотя это тоже сломало бы внутренности startDate .

2. пожалуйста, обновите вопрос о том, 1) хотите ли вы заменить только пробелы (» «) или все пробелы («s») и 2) хотите ли вы сохранить пробелы в данных xml-элемента, как вы, похоже, делаете, на основе вашего примера.

Ответ №1:

 message = messsage.replaceAll("(?<=>)\s*(?=<)","n")
 

Ответ №2:

Правильное регулярное выражение должно соответствовать только пробелам между > < символами и, поэтому оно будет выглядеть следующим >s*?< образом (оно также будет работать, если у вас нет пробелов между >< XML-тегами).

И строка замены будет >n<

Обратите внимание, что второй параметр для String.replaceAll-это обычная строка, а не регулярное выражение, поэтому вам не нужно экранировать ее обратными косыми чертами .

обратные косые черты () и знаки доллара ($) в строке замены могут привести к тому, что результаты будут отличаться от результатов, если бы они рассматривались как строка замены литерала. Знаки доллара могут рассматриваться как ссылки на захваченные подпоследовательности, а обратные косые черты используются для экранирования буквенных символов в строке замены.

 message.replaceAll("\>s*?\<", ">n<");
 

Вы можете запустить его онлайн здесь — https://www.mycompiler.io/view/1Bm8MzU


Если ваша XML-строка уже отформатирована (т. Е. Имеет отступы с пробелами), вы можете сохранить эти символы пробелов, записав их в группу >(s*?)< и добавив новый символ строки перед использованием этой группы >n$1< .

 message.replaceAll("\>(\s*?)\<", ">n$1<")
 

Вы можете запустить его онлайн здесь — https://www.mycompiler.io/view/5zaV7tf

Ответ №3:

 String message = "<?xml version="1.0" encoding="ISO-8859-1"?>  <entity>  <id>8624</id>  <name>Test_Report.csv</name>  <startDate>24/05/2021 9:15 am</startDate>  <level>info</level>  </entity>";
String result = message.replaceAll(">\s*<", ">n<");
System.out.println(result);
 

будет соответствовать всем вхождениям нуля или более пробелов, помещенных между > < символами и, а затем соответствующий шаблон будет заменен на >n< вывод:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<entity>
<id>8624</id>
<name>Test_Report.csv</name>
<startDate>24/05/2021 9:15 am</startDate>
<level>info</level>
</entity>