想象一下,我有这个文本(我意识到使用正则表达式解析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
然而,现在匹配错误的东西,因为模式匹配HELLO2
和BANANA
我想要HELLO3
和BANANA
我意识到这是因为我使用.*?
但这是现实生活解决方案所必需的。
示例:https://regex101.com/r/h4YgDm/3
我怎样才能匹配,只有整个模式,但仍然跨越多行?
我的一位同事给了我这个答案,这就是我想要的:
https://regex101.com/r/h4YgDm/8
正则表达式:(?:(?:<div><p>(\w*)<\/p>\s)(?!<span>CHEESE<\/span>)(?:<span>(\w*)<\/span>)<\/div>)