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. I am not sponsored by them and did not receive any compensation to write this post...I just simply think the Tortas 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个实例。需要稍微调整一下。