2012-11-08 37 views
0

對不起,但我不確定如何更好地解釋它。正則表達式與模式中最後一個字符的第一個實例不匹配

我正在爲一個學校項目建立一個簡單的網絡服務器,它必須解析一個自定義的腳本語言。我有一條線,看起來像這樣:

<p>Here's the date: <% pr date() %></p><p>Here's the date again: <% pr date() %></p> 

我使用下面的正則表達式,試圖拉出<%...%>的東西...

<% *(.*) *%> 

問題是從第一個開放標籤到最後一個結束標籤進行匹配,而不是從第一個開放標籤到第一個結束標籤進行匹配。所以導致比賽是這樣的:

<% pr date() %></p><p>Here's the date again: <% pr date() %> 

...而不是:

<% pr date() %> 

我以爲我可以用這樣的解決它,但它似乎並沒有工作:

<% *([^(<%)]*) *%> 

...但它似乎沒有工作。任何幫助表示讚賞,謝謝。

回答

2

問題是,它是從第一個打開的標籤匹配到最後結束標記

您需要停靠在第一時間非貪婪匹配匹配確認:

.* --> greedy ("maximum munch") 
.*? --> non-greedy ("minimal munch") 

非貪心量詞當然可以應用於大多數其他模式。

但是,我會反對使用正則表達式。元模式OPEN-TOKEN CONTENT CLOSE-TOKEN對於手寫解析器/掃描儀來說足夠簡單。那麼它也更容易,當你的標籤中的註釋(可能還有其他案件,你不想匹配)爲您認識到:

<!-- <% xyz %> --> 

代碼像上面可能不是你被鼓勵的,但你必須考慮這一點。


腳註:每次(write a parser|fire a regular expression),你在監獄裏的一條腿了。

+0

謝謝你,你能指出我在一個資源的方向可能解釋正則表達式的替代更詳細?如果我要寫一個手寫的解析器/掃描器,我不知道從哪裏開始。 – ARW

+0

但是您已經在編寫自定義腳本語言了? –

+0

也可以在評論中動態地插入值。例如T4模板不考慮封閉文本的語法。 –

1

您正在使用.*這是貪婪的量詞

使用.*?代替.*這是一個懶惰的量詞

我。e使用正則表達式<%(.*?)%>


所以<%(.*)%>將匹配直到最後%>發現

<%(.*?)%>將匹配直到第一%>發現

相關問題