[英]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.