想象一下我有这段文字(我意识到使用正则表达式解析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
我如何匹配整个模式,但仍然跨越多行?
答案 0 :(得分:0)
您可以分两步实现您想要的。首先,提取满足以下条件(即demo)的div
元素:
<div>(?:(?!CHEESE).)*?<\/div>
第二,选择p
和span
标签之间的内容作为两个组(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>)