多次匹配整个多行模式,但如果匹配包含字符串则不匹配
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
但是,现在匹配错误的东西,因为模式匹配 HELLO2
和 BANANA
我想要 HELLO3
和 BANANA
我意识到这是因为我正在使用 .*?
,但这是实际解决方案所必需的。
此处示例:https://regex101.com/r/h4YgDm/3
我怎样才能匹配一个完整的模式,但仍然跨越多行?
您可以分两步实现您想要的。首先,像这样提取符合条件(即没有奶酪)的 div
个元素 (demo):
<div>(?:(?!CHEESE).)*?<\/div>
二、selectp
和span
标签之间的内容为两组(demo):
(?<=<p>)(.*?)(?=<\/p>)(?:.*?)(?<=<span>)(.*?)(?=<\/span>)
我的一个同事给我发了这个答案,它符合我的要求:
https://regex101.com/r/h4YgDm/8
正则表达式:(?:(?:<div><p>(\w*)<\/p>\s)(?!<span>CHEESE<\/span>)(?:<span>(\w*)<\/span>)<\/div>)
假设我有这段文字(我意识到使用正则表达式解析 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
我怎样才能匹配一个完整的模式,但仍然跨越多行?
您可以分两步实现您想要的。首先,像这样提取符合条件(即没有奶酪)的 div
个元素 (demo):
<div>(?:(?!CHEESE).)*?<\/div>
二、selectp
和span
标签之间的内容为两组(demo):
(?<=<p>)(.*?)(?=<\/p>)(?:.*?)(?<=<span>)(.*?)(?=<\/span>)
我的一个同事给我发了这个答案,它符合我的要求:
https://regex101.com/r/h4YgDm/8
正则表达式:(?:(?:<div><p>(\w*)<\/p>\s)(?!<span>CHEESE<\/span>)(?:<span>(\w*)<\/span>)<\/div>)