簡體   English   中英

使用正則表達式匹配字符串中字符的最后一次出現

[英]Matching from the last occurence of a character in a string with Regex

是的,我知道,不要用正則表達式解析html。 說:

我正在嘗試在第一個標簽中帶有單詞“ Title”的任何標簽之間捕獲內容。

我開始於:

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

我正在尋找“命名組捕獲”是已知單詞/字符串的地方。 為了進行研究,我還捕獲了QUALIFY_TITLE名稱組。 之所以這樣做,是因為除非我以這種方式“限定”字符串/項,否則我不想要它。

但是,如果我有一部分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字符串(KnownTermIWant),但Qualify字符串從第一個“

我試圖讓QUALIFY_TITLE從標題前的最后一個“ <”開始/捕獲,而不是從頭開始,換句話說,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"

問題在於正則表達式搜索將在第一時間嘗試匹配,並且非貪婪的量詞( *?代替* )不會影響某項是否匹配。 例如,給定字符串abcd ,正則表達式.*?d將匹配整個內容,因為.*? 仍會根據需要匹配,以確保正則表達式匹配。

你明白我的意思嗎?

因此,您需要使子表達式更加精確。 例如,您應該編寫<([^>]*)(title)([^>]*)>而不是<(.*?)(title)(.*?)> <([^>]*)(title)([^>]*)>

問題

這里只有一個問題,您完全符合您的要求:)

過程

如果您只想匹配最后一個標簽,請問自己以下問題:

“每個前面的標簽里面有什么,但是我想要的標簽里面沒有?”

結論

答案是打開/關閉標簽本身:

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

您的代碼相當混亂,但是我將以更簡化的方式回答標題中的問題:

在此示例代碼中:

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

如果要從第一個 <div>匹配到最后一個 </div> ,則可以只使用一個貪婪的量詞,例如+*

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

它將匹配整個字符串,直到最后一個</div>

演示版

如果這不能解決您的問題,則正則表達式的復雜度將很快變得非常高(對於額外的要求,它的指數成倍地復雜),所以就像您在第一行中所說的那樣,只需使用解析器即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM