#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>