2

有人可以告诉我为什么我的模式:<p(\s+(.*)?)?>(.[^</p>]*)?</p>不能正常工作。示例匹配:

  1. <p>This is a test and anything can be here even other <tags>tags</tags></p>
  2. <p style="test">This is a test</p>
  3. <p></p>

如果以上都在一行上,它应该找到 3 个单独的模式。下面的链接展示了它的真实行为,这很奇怪......

http://regexr.com?33jrn

它找到的匹配项应始终在找到时立即开始,并在找到<p时立即停止</p>

4

3 回答 3

3

您的正则表达式存在一些问题。让我们看看它们长什么样。

这是你的正则表达式: -

<p(\s+(.*)?)?>(.[^</p>]*)?</p>
  • 问题 1: -注意模式(.*)?。它没有按照你的想法做。这不是对*量词强制执行不情愿的行为。(?)相反,它是对贪婪量词的强制可选*量词。它只是意味着匹配0 or 1重复(.*)。为了让它不情愿,您需要?在支架内移动。因此,您需要使用(.*?)而不是(.*)?.
  • 问题2: - [^</p>]不是否定</p>而是否定 -<, /, p, >作为单独的字符。请注意,在字符类中,每个字符都是按字面意思理解的。里面没有分组。所以,(.[^</p>]*)意味着匹配一个characterif 后面不跟0 or more repetitionof 中的任何一个[</p>]。那不是你想要的。如果你想匹配一个不是 的序列</p>,那么你可以像这样使用否定的前瞻: - ((?!</p>).)*。现在这将首先检查以下序列是否不是</p>,然后匹配下一个字符。

所以,你的正则表达式模式应该是: -

<p(\s+(.*?))?>((?!</p>).)*</p>

或者,您甚至可以将您的正则表达式简化为: -

<p[^>]*>((?!</p>).)*</p>
于 2013-01-31T08:29:53.800 回答
1

试试这个:

<p.*?>.*?</p>

请在此页面上阅读关于贪婪和不情愿的内容:“贪婪、不情愿和占有量词之间的区别”。

于 2013-01-31T08:24:50.037 回答
1

问题出在 中(.[^</p>]*)?,这意味着:

  • 一个字符
  • 后跟任何 char n 次,但不是 a <,既不是 a /,也不是 ap和也不是 a>

我猜你的意思不是</p>字符串 n times,但这不是这样做的方法。

尝试使用.*?<p(\s+(.*)?)?>.*?</p>.

while.*表示匹配最长的字符串.*?表示匹配最短的字符串

例如,对于字符串#foo#bar#.*将匹配#foo#bar#.*?将匹配#foo#

于 2013-01-31T08:25:36.717 回答