Получить все между первым символом «<» и последним символом «>» - PullRequest
0 голосов
/ 13 декабря 2018

Так что я пытаюсь получить XML только из этого формата:

--------------------------3cbec9ce8f05
Content-Disposition: form-data; name="owServerData"; filename="details.xml"
Content-Type: text/plain

<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response xmlns="http://www.example.com"> 
 // Rest omitted
</Devices-Detail-Response>
------------------------------3cbec9ce8f05--

Так что в основном все после первого <и все между до последнего '>.

Такпока у меня есть .*<(.*)>.*, который только возвращает <?xml version="1.0" encoding="UTF-8"?>

Спасибо!

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response xmlns="http://www.example.com"> 
 // Rest omitted
</Devices-Detail-Response>

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

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

<\?xml version="1\.0" encoding="UTF-8"\?>\s*<\s*([^\s]*)(?:.|\s)*<\/\s*\1\s*>

Ввод:

--------------------------3cbec9ce8f05
Content-Disposition: form-data; name="owServerData"; filename="details.xml"
Content-Type: text/plain

<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response xmlns="http://www.example.com"> 
 <device>a</device>
 <info>abc</info>
 <test1><u>123</u><v>456</v><z/></test1>
</Devices-Detail-Response>
------------------------------3cbec9ce8f05--

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<Devices-Detail-Response xmlns="http://www.example.com" 
 <device>a</device>
 <info>abc</info>
 <test1><u>123</u><v>456</v><z/></test1>
</Devices-Detail-Response>

демо: https://regex101.com/r/r6Kbh2/3/

0 голосов
/ 13 декабря 2018

Период по умолчанию не будет соответствовать разрывам строк.Вам нужно будет использовать модификатор s.

Кроме того, ваша первая точка жадная, и она будет поглощать все ваши < до последней, которая все еще позволяет сопоставить оставшийся шаблон.Вместо использования не жадной точки .*?, я бы использовал отрицательный класс символов, чтобы сопоставить все, кроме <.

/[^<]*<(.*)>.*/s

См. На Regex101

Альтернативным методом будет использование символов \r (возврат каретки) и \n (новая строка) в классе символов:

/[^<]*<((?:.|[\r\n])*)>.*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...