讀古今文學網 > 精通正則表達式(第3版) > 拓展示例 >

拓展示例

Additional Examples

為Image Tag添加寬度和高度屬性

Adding Width and Height Attributes to Image Tags

這裡給出個高級的例子,原地(in-place)查找替換,修改HTML,保證所有的image tag都包含WIDTH和HEIGHT屬性(HTML必須是StringBuilder、StringBuffer,或者其他CharSequence)。

只要有一副圖像沒有規定寬度或者高度,就可能降低整個頁面的裝載速度,因為瀏覽器在顯示這幅圖像之前必須讀入整個文件。如果包含了寬度和高度的尺寸,文本和其他元素就可以立刻正確擺放,這樣用戶會感覺頁面讀取速度更快(注8)。

如果找到image tag,程序會尋找SRC、WIDTH和HEIGHT屬性,如果存在,提取他們的值。如果WIDTH和HEIGHT有一個不存在,就先取回圖像,計算尺寸,然後補充上屬性。如果WIDTH和HEIGHT都沒有,就按照圖像的真實尺寸來設置這些屬性。如果存在一個,就只需要算出另一個屬性,它的值是按比例計算出來的(例如,如果WIDTH是真實尺寸的一半,則添加的HEIGHT的值也是真實高度的一半;現代的瀏覽器就是這樣處理的)。和第383頁的代碼一樣,這個程序手動維護匹配指針。它還使用了檢索範圍(☞384)和方法鏈(☞389)。代碼如下:

儘管這例子很有教育意義,但還是有少數地方沒考慮到。因為這個例子的重點在於本地查找和替換,盡可能地簡化了其他方面,對需要處理的HTML進行了理想的假設。例如,正則表達式不容許屬性的等號兩邊出現空白,屬性中不會出現引號(參考第202頁的Perl正則表達式,可以得到有實際意義的,Java版本的tag屬性匹配的辦法)。這個程序不能處理相對URL,也不能處理格式錯誤的URL,也不能處理獲取圖像的代碼拋出的任何異常。

不過,這個例子仍然說明了幾個重要的概念。

對於每個Matcher,使用多個Pattern校驗HTML

Validating HTML with Multiple Patterns Per Matcher

我們也可以用Java來寫校驗簡單HTML的程序(☞132)。這段代碼通過usePattern方法實時更換Matcher的pattern。這樣能夠處理多個以「\G」開頭的pattern,進行對應的操作。請參考第132頁的內容瞭解此方法的更多細節。

因為java.util.regex的bug,非HTML的匹配嘗試即使不成功,仍然會「佔用」目標字符串中的一個字符,所以我把這段程序放在最後。這個 bug 仍然存在,只是表現為錯誤輸出中缺少第一個字符。我已經把這個bug提交給Sun。

此bug沒有修正之前,該如何使用單個參數的find方法來解決此問題呢?ϖ 請翻到下頁查看答案。

解析CSV文檔

Parsing Comma-Separated Values (CSV) Text

這裡是用 java.util.regex寫的解析CSV 的例子(參見第6 章☞271)。這裡的程序使用佔有優先量詞(☞142)取代固化分組,因為這樣看起來更清楚。

這個程序比第217頁的原始程序效率要高很多,原因在於:正則表達式效率更高,按照第6章第271頁介紹的辦法,重複使用單個Matcher(通過單個參數版本的reset方法),而沒有不斷創建-回收Mather。