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

Matching entire, multiline pattern, multiple times but not if match contains string

假设我有这段文字(我意识到使用正则表达式解析 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

我怎样才能匹配一个完整的模式,但仍然跨越多行?

您可以分两步实现您想要的。首先,像这样提取符合条件(即没有奶酪)的 div 个元素 (demo):

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

二、selectpspan标签之间的内容为两组(demo):

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

我的一个同事给我发了这个答案,它符合我的要求:

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

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