簡體   English   中英

使用Lookahead使用正則表達式匹配字符串

[英]Using Lookahead to match a string using a regular expression

我需要使用正則表達式來匹配holiding html字符串,以拉出所有嵌套的跨度,我假設我假設有一種使用正則表達式來做到這一點的方法,但是整個上午都沒有成功。

因此對於一個示例輸入字符串

<DIV id=c445c9c2-a02e-4cec-b254-c134adfa4192 style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; BACKGROUND-COLOR: #eeeeee">
<SPAN id=b8db8cd1-f600-448f-be26-2aa56ea09a9c>
<SPAN id=304ccd38-8161-4def-a557-1a048c963df4>
<IMG src="http://avis.co.uk/Assets/build/menu.gif">
</SPAN>
</SPAN>
<SPAN id=bc88c866-5370-4c72-990b-06fbe22038d5>
<SPAN id=55b88bbe-15ca-49c9-ad96-cecc6ca7004e>UK<BR></SPAN>
</SPAN>
<SPAN id=52bb62ca-8f0a-42f1-a13b-9b263225ff1d>
<SPAN id=0e1c3eb6-046d-4f07-96c1-d1ac099d5f1c>
<IMG src="http://avis.co.uk/Assets/build/menu.gif">
</SPAN>
</SPAN>
<SPAN id=4c29eef2-cd77-4d33-9828-e442685a25cb>
<SPAN id=0d5a266a-14ae-4a89-9263-9e0ab57f7ad2>Italy</SPAN>
</SPAN>
<SPAN id=f0a72eea-fddd-471e-89e6-56e9b9efbece>
<SPAN id=b7d9ada7-ade0-49fe-aa5f-270237e87c2b>
<IMG src="http://avis.co.uk/Assets/build/menu.gif">
</SPAN>
</SPAN>
<SPAN id=7604df94-34ba-4c89-bf11-125df01731ff>
<SPAN id=330d6429-4f1b-46a2-a485-9001e2c6b8c1>Netherlands</SPAN>
</SPAN>
<SPAN id=a18fb516-451e-4c32-ab31-3e3be29235f6>
<SPAN id=6c70238d-78f9-468f-bb8d-370fff13c909>
<IMG src="http://avis.co.uk/Assets/build/menu.gif">
</SPAN>
</SPAN>
<SPAN id=5a2465eb-b337-4f94-a4f8-6f5001dfbd75>
<SPAN id=47877a9e-a7d5-4f13-a41e-6948f899e385>Malta &amp; Gozo

我想獲取每個外部跨度及其包含的跨度,因此在上面的文本中應該有八個結果

任何幫助都樂意接受

再次使用HTML解析器遍歷DOM:正則表達式永遠不會足夠強大以做到這一點。

實際上,使用標准正則表達式無法解決此問題,因為它們基本上在Chomsky層次結構 (有限狀態自動機)中實現了類型3語法,而您至少需要類型2語法(某種堆棧或遞歸)才能正確識別任意嵌套結構。

但是,如果您限制最大可能的嵌套級別,則可能是可行的,但是我仍然懷疑正則表達式是否是最佳解決方案。

嘗試這個:

@"(?is)<SPAN\b[^>]*>\s*(<SPAN\b[^>]*>.*?</SPAN>)\s*</SPAN>"

這與PhiLho的正則表達式基本相同,不同之處在於它允許兩端的標簽之間留有空格。 我還必須添加SingleLine / DOTALL修飾符以適應匹配文本內的行分隔符。 我不知道這些更改中的任何一項是否真的必要; OP發布的樣本數據全都在一行上,但是PhiLho將其分解(從而破壞了他自己的正則表達式)。

基本上,我同意上述建議,使用正則表達式解析HTML要求有一天代碼會在奇怪的合法HTML構造上中斷(更不用說瀏覽器接受的格式錯誤的HTML ...)。 查找和使用良好的HTML解析器可以在許多方面帶來回報。

現在,我很務實(我無法抗拒一些正則表達式挑戰...),有時我對機器生成的HTML使用RE(通常是導出功能),因為我知道我看到的結構不太可能改變,與手工不同生成的頁面,作者可以在其中進行拼寫...主要用於快速修改內容,如果輸出發生變化,我可以進行調整。

在您的情況下,HTML非常規則,線性且可預測,因此RE非常簡單。 我給出Java代碼是因為我不了解C#,但是適應性應該是微不足道的。

Pattern p = Pattern.compile("(<SPAN id.*?<SPAN id.*?</SPAN></SPAN>)");
Matcher m = p.matcher(html);
while (m.find())
{
  System.out.println(m.group(1));
}

HTH。

暫無
暫無

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

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