多次匹配整个多行模式,但如果匹配包含字符串则不匹配

时间:2019-03-27 08:23:25

标签: regex regex-negation regex-lookarounds

想象一下我有这段文字(我意识到使用正则表达式解析HTML不是正确的解决方案...)

 <div><p>HELLO1</p>
 <span>SPIDER</span></div>
 <div><p>HELLO2</p>
 <span>CHEESE</span></div>
 <div><p>HELLO3</p>
 <span>BANANA</span></div>

我想分别匹配<p><span>中的文本(这是一个人为的示例)

我可以通过使用以下方法来实现:

/<p>(.*?)<\/p>.*?<span>(.*?)<\/span>.*?<\/div>/gsmi

但是,如果范围内的文本为CHEESE,我不想匹配。 香港专业教育学院试图像这样使用否定的前瞻:

/<p>(.*?)<\/p>.*?<span>((?!CHEESE).*?)<\/span>.*?<\/div>/gsmi

但是,由于模式与HELLO2BANANA所在的HELLO3BANANA匹配,因此现在匹配了错误的内容

我意识到这是因为我使用.*?,但这是实际解决方案所必需的。

此处的示例:https://regex101.com/r/h4YgDm/3

我如何匹配整个模式,但仍然跨越多行?

2 个答案:

答案 0 :(得分:0)

您可以分两步实现您想要的。首先,提取满足以下条件(即demo)的div元素:

<div>(?:(?!CHEESE).)*?<\/div>

第二,选择pspan标签之间的内容作为两个组(demo):

(?<=<p>)(.*?)(?=<\/p>)(?:.*?)(?<=<span>)(.*?)(?=<\/span>)

答案 1 :(得分:0)

我的一个同事给我发送了这个答案,该答案正是我想要的:

https://regex101.com/r/h4YgDm/8

正则表达式:(?:(?:<div><p>(\w*)<\/p>\s)(?!<span>CHEESE<\/span>)(?:<span>(\w*)<\/span>)<\/div>)