【问题标题】:Matching from the last occurence of a character in a string with Regex使用正则表达式从字符串中最后一次出现的字符开始匹配
【发布时间】:2014-05-25 21:21:42
【问题描述】:

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

我正在尝试在第一个标签中带有“标题”一词的任何标签之间捕获内容。

我开始:

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

命名组捕获是我正在寻找的已知单词/字符串。为了研究,我还捕获了 QUALIFY_TITLE 名称组。我这样做是因为我不想要字符串/术语,除非我以这种方式“限定”它。

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

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

虽然我得到了我想要的 CAPTURE 字符串 (KnownTermIWant),但 Qualify 字符串从第一个 "

我试图让 QUALIFY_TITLE 从标题之前的最后一个“

&lt;div id="divTitle

甚至

&lt;div id="divTitle" class="title"&gt;

但我目前正在接受

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

【问题讨论】:

    标签: regex


    【解决方案1】:

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

    你明白我的意思吗?

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

    【讨论】:

      【解决方案2】:

      问题

      这里只有一个问题,你完全符合你的要求:)

      过程

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

      “前面的每个标签里面都有什么,但我想要的标签里面没有?”

      结论

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

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

      【讨论】:

        【解决方案3】:

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

        在此示例代码中:

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

        如果你想从 first &lt;div&gt; 匹配到 last &lt;/div&gt;,你可以使用一个贪婪的量词,例如 + 或 @ 987654326@:

        /<div>(.*)<\/div>/
        

        这将匹配整个字符串,直到最后一个 &lt;/div&gt;

        Demo

        如果这不能回答您的问题,则正则表达式的复杂性会很快变得更高(对于额外的要求,它的复杂程度会成倍增加),所以就像您在第一行中所说的那样,只需使用解析器即可。

        【讨论】:

        • 事实上我正试图做相反的事情;匹配第一个
          或者在我的情况下是第一个 bla MATCH something 的模式或具有 Example text 的匹配项Foo bar Hello world
          Lorem ipsum
          匹配
        猜你喜欢
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        相关资源
        最近更新 更多