匹配字符串中字符的最后一次出现与正则表达式

时间:2014-05-25 21:21:42

标签: regex

是的我知道,不要用正则表达式解析html。那说:

我正在尝试使用单词" Title"在第一个标签中。

我开始时:

(?P<QUALIFY_TITLE><(.*?)(title)(.*?)>)(.*?)?(?<CAPTURE>KnownTermIWant)(.*?)(\<\/.*?>)

命名组捕获是我正在寻找的已知单词/字符串。我还为了研究而捕获QUALIFY_TITLE名称组。我之所以这样做是因为我不想要字符串/术语,除非我有资格获得&#39;就这样。

但是,如果我有一个看起来像这样的html的一部分:

<div class="wwm"><div class="inbox"><input name="language-id" type="hidden" id="language-id" value="" /><input name="widget-page-handle" type="hidden" id="widget-page-handle" value="wwm4widget_post" /><input name="email-page-handle" type="hidden" id="email-page-handle" value="wwm4widget_emailpopup" /><div id="divWidget" style="display: block;" class="vhWidget"> <div id="divShareLink" style="display: block;" class="shareLink"><div id="divTitle" class="title">KnownTermIWant</title>

虽然我得到了我想要的CAPTURE String(KnownTermIWant),但Qualify字符串从第一个字符串开始#34;

我正在努力让QUALIFY_TITLE从最后一个开始/捕获&#34;&lt;&#34;在标题之前不是第一个,换句话说QUALIFY TITLE应该是:

<div id="divTitle

甚至

<div id="divTitle" class="title">

但我现在正在

<div class="wwm"><div class="inbox"><input name="language-id" type="hidden" id="language-id" value="" /><input name="widget-page-handle" type="hidden" id="widget-page-handle" value="wwm4widget_post" /><input name="email-page-handle" type="hidden" id="email-page-handle" value="wwm4widget_emailpopup" /><div id="divWidget" style="display: block;" class="vhWidget"> <div id="divShareLink" style="display: block;" class="shareLink"><div id="divTitle" class="title"

3 个答案:

答案 0 :(得分:1)

问题是正则表达式搜索会尝试在第一个可能的机会匹配,而非贪婪量词(*?而不是*)不会影响某些内容是否匹配。例如,给定字符串abcd,正则表达式.*?d将匹配整个事物,因为.*?仍将匹配所需的数量,以确保正则表达式匹配。< / p>

你明白我的意思吗?

所以你需要让你的子表达更加精确;例如,您应该写<(.*?)(title)(.*?)>而不是<([^>]*)(title)([^>]*)>

答案 1 :(得分:1)

问题

这里只有一个问题,你的确与你所要求的完全匹配:)

过程

如果您只想匹配最后一个标签,请问自己这个问题:

  

&#34;每个前面的标签内部是什么,但不在我想要的内部?#34;

结论

答案是打开/关闭标签本身:

(?P<QUALIFY_TITLE><([^<>]*?)(title)(.*?)>)(.*?)?(?<CAPTURE>KnownTermIWant)(.*?)(\<\/.*?>)
                    ^^^^^

答案 2 :(得分:0)

您的代码非常混乱,但我会以更加简化的方式回答标题中的问题:

在此示例代码中:

<div>Example text<div>Foo bar</div> Hello world <div>Lorem ipsum</div></div> hi

如果您想从第一个 <div>匹配到 last </div>,您可以使用贪婪的量词,例如{ {1}}或+

*

这将匹配整个字符串,直到最后一个/<div>(.*)<\/div>/

Demo

如果这不能回答你的问题,那么正则表达式的复杂性会很快变得更快(对于额外的要求,它的基本指数会更加复杂),所以就像你在第一行中所说的那样,只需使用解析器。