获取第一个字符“ <”和最后一个字符“>”之间的所有内容

时间:2018-12-13 01:02:53

标签: c# regex

所以我试图仅从这种格式获取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 :(得分:1)

默认情况下,句点与换行符不匹配。您将需要使用s修饰符。

另外,您的第一个点是贪婪的,它将消耗您所有的<到最后一个仍然允许其余模式匹配的点。我将使用否定的字符类来匹配除.*?以外的所有字符,而不是使用非贪心的点<

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

Regex101上查看

另一种方法是在字符类中使用\r(回车符)和\n(换行符):

/[^<]*<((?:.|[\r\n])*)>.*/

答案 1 :(得分:1)

您可以尝试以下正则表达式:

<\?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/