gpt4 book ai didi

c# - 正则表达式 Lookbehind 无法按预期工作

转载 作者:行者123 更新时间:2023-12-03 23:08:36 26 4
gpt4 key购买 nike

我在 .net 中有一个字符串。

<p class='p1'>Para 1</p><p>Para 2</p><p class="p2">Para 3</p><p>Para 4</p>

现在,我只想获取标签 p 内的文本(Para 1、Para 2、Para 3、Para4)。

我使用了以下正则表达式,但它没有给我预期的结果。

(?<=<p.*>).*?(?=</p>)

如果我使用 (?<=<p>).*?(?=</p>)它会给出 Para 2 和 Para 4 这两个 p 标签都没有类属性?

我想知道 (?<=<p.*>).*?(?=</p>) 出了什么问题那个代码。

最佳答案

让我们用 RegexBuddy 来说明这一点:

RegexBuddy Screenshot

你的正则表达式比你想象的更匹配——点匹配任何字符,所以它不关心标签边界。

它实际上在做什么:

  • (?<=<p.*>) : 断言有 <p (后跟任意数量的字符)当前位置之前字符串中的任意位置,后跟 > .
  • .*? : 匹配任意数量的字符...
  • (?=</p>) : ...直到下一次出现 </p> .

您的问题有点不清楚,但如果您的计划是在 <p> 内查找文本标签,无论它们是否包含任何属性,您都不应该使用正则表达式,而应该使用 DOM 解析器,例如 HTML agility pack .

也就是说,如果您坚持使用正则表达式,请尝试

(?<=<p[^<>]*>)(?:(?!</p>).)*

Another screenshot

解释:

(?<=<p[^<>]*>)  # Assert position right after a p tag
(?:(?!</p>).)* # Match any number of characters until the next </p>

关于c# - 正则表达式 Lookbehind 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7964812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com