Ruby 正则表达式中的最短匹配

Ruby 正则表达式中的最短匹配,ruby,regex,Ruby,Regex,这是我的正则表达式: /<strong>.*ingredients.*<\/ul>/im /*配料。*/im 假设源代码: <strong>Contest closes on Thursday May 10th 2012 at 9pm PST</strong></div> <br /> <br /> <br /> * I am not affiliated with Blue Marble Bra

这是我的正则表达式:

/<strong>.*ingredients.*<\/ul>/im
/*配料。*/im
假设源代码:

<strong>Contest closes on Thursday May 10th 2012 at 9pm PST</strong></div>
<br />
<br />
<br />
* I am not affiliated with Blue Marble Brands or Ines Rosales Tortas in any way.&nbsp; I am not sponsored by them and did not receive any compensation to write this post...I just simply think the&nbsp;Tortas&nbsp;are wonderful!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-35J5vNrXkqE/T6htXTafrmI/AAAAAAAAA5E/g2mtiuSpSmw/s1600/food+003.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" mea="true" src="http://1.bp.blogspot.com/-35J5vNrXkqE/T6htXTafrmI/AAAAAAAAA5E/g2mtiuSpSmw/s640/food+003.JPG" width="640" /></a></div>
<br />
<strong><span style="font-size: large;">Ingredients:</span></strong><br />
<ul>
<li>Ines Rosales Rosemary and Thyme Tortas</li>
<li>Pizza Sauce (ready made in a jar)</li>
<li>Roma Tomatoes</li>
<li>Roasted Red Peppers </li>
<li>Marinated Artichoke Hearts</li>
<li>Olives (I used Pitted Spanish Manzanilla Olives)</li>
<li>Daiya Vegan Mozzarella Cheese</li>
</ul>
<span style="font-size: large;"><strong>Directions:</strong></span><br />
<br />
Spread small amount of pizza sauce over Torta. 
比赛将于2012年5月10日星期四太平洋标准时间晚上9点结束



*我与Blue Marble Brands或Ines Rosales Tortas没有任何关联。我没有得到他们的赞助,也没有得到任何报酬来写这篇文章……我只是觉得这些玉米饼太棒了


成分:
  • 玫瑰、迷迭香和百里香玉米饼
  • 比萨酱(罐装)
  • 罗马番茄
  • 烤红辣椒
  • 腌制朝鲜蓟心
  • 橄榄(我用的是有斑点的西班牙曼扎尼拉橄榄)
  • 黛雅纯素马苏里拉奶酪
说明:

在玉米饼上涂上少量比萨酱。
正则表达式是贪婪的,它从
竞赛中攫取一切…
但是最短的匹配应该产生
成分…

这是我的要点:

::编辑:: 请允许强力标签和配料以及配料和ul之间的灵活性。

尝试以下方法:

/<strong><span.*ingredients.*<\/ul>/im
/这应该可以:

/(?!<strong>.*<strong>.*<\/ul>)<strong>.*?ingredients.*?<\/ul>/im
/(?!**)*?配料。*?/im
测试一下


基本上,正则表达式使用负前瞻性来避免在
之前出现多个
,就像这样:
(?!**)
我想这就是您要找的:

/<strong>(?:(?!<strong>).)*ingredients.*?<\/ul>/im
/(?:(?!)*配料。*?/im
(?:(?!)*
替换第一个
*
允许它在找到
成分之前匹配除另一个
标记以外的任何内容。在此之后,非贪婪的
*?
导致它在看到
的第一个实例时停止匹配。(您的示例仅包含一个
元素,但我假设实际数据可能包含更多。)


通常的警告适用于:即使在完全有效的HTML中,也有许多方法可以愚弄这个正则表达式,更不用说我们通常在那里看到的dreck了。

注意,使用Ruby,您可以使用
%r{..}
来表示您的正则表达式文本,这样您就不必逃避前斜杠,例如
%r{*?成分。*
@KarolyHorvath-在这里使用nongreedy
将无法与
*?
配合使用,因为他需要第一个
作为后期匹配。推荐Nokogiri需要+1,但仍然使用贪婪的Kleene星而不是非贪婪的
*?
需要-1。Nokogiri不适用于这种特殊情况。。。我经常使用它,但我正在解析不同的网站,其中包含强效、成分和ul,以及中间的随机内容。。我需要保持尽可能高的水平。有时候xml的格式不是很好,但是解析引擎应该足够强大,可以处理这个问题。这是一个通用的指导原则。很好,你知道了。如果这是最短匹配项,请接受回答。@DanielSzmulewicz-您的正则表达式适用于OP作为假设给出的特定示例。这仍然不能解决最短匹配的原始问题。@Kash。对的很抱歉,我不知道自己陷入了什么境地。很好的解决方案。我想你的意思是消极的回顾,它仍然是消极的前瞻。lookbehind由
(?)表示。不幸的是,此解决方案不适用于
的3个实例。需要稍微调整一下。