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

问题描述 投票:-1回答:2

想象一下,我有这个文本(我意识到使用正则表达式解析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

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

regex regex-negation regex-lookarounds
2个回答
0
投票

你可以通过两个步骤实现你想要的。首先,提取符合标准的div元素(即没有CHEESE)(demo):

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

其次,选择pspan标签之间的内容为两组(demo):

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

0
投票

我的一位同事给了我这个答案,这就是我想要的:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.