[英]Regular Expression Lookbehind doesn't work as expected
我在.net中有一个字符串。
<p class='p1'>Para 1</p><p>Para 2</p><p class="p2">Para 3</p><p>Para 4</p>
现在,我只想在标签p(第1款,第2款,第3款,第4款)中获取文本。
我使用了以下正则表达式,但没有得到预期的结果。
(?<=<p.*>).*?(?=</p>)
如果我使用(?<=<p>).*?(?=</p>)
,它将给出第2段和第4段,这两个p标签都没有类属性?
我想知道(?<=<p.*>).*?(?=</p>)
该代码出了什么问题。
让我们使用RegexBuddy进行说明:
您的正则表达式比您想象的更匹配-点匹配任何字符,因此它不在乎标记边界。
它实际上在做什么:
(?<=<p.*>)
:断言在当前位置之前的字符串中的任何地方都有<p
(后跟任意数量的字符),后跟一个>
。 .*?
:匹配任意数量的字符... (?=</p>)
:...直到下一次出现</p>
。 您的问题还不清楚,但是如果您打算在<p>
标记中查找文本,而不管它们是否包含任何属性,那么您不应该使用正则表达式,而应该使用DOM解析器,例如HTML agility pack 。
也就是说,如果您坚持使用正则表达式,请尝试
(?<=<p[^<>]*>)(?:(?!</p>).)*
说明:
(?<=<p[^<>]*>) # Assert position right after a p tag
(?:(?!</p>).)* # Match any number of characters until the next </p>
您是否尝试过使用以下表达式?
<p[\s\S]*?>(?<text_inside_p>[\s\S]*?)</p>
名为text_inside_p
组将包含所需的文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.