驗證, 格式化及正則表逹式這幾個單詞給讀者的第一印象可能會比較陌生。其實, 開發者在日常的工作中已經不知不覺地接觸過不少類似的事物, 比如說: 透過剖析字符串的格式去檢測某種模式; 當特定的字符串模式被檢測或沒有檢測到時修改字符串至一定模式; 當一些必要的屬性沒有被檢測到的時候, 返回錯誤訊息等。因為一些日常事物如電話號碼, 姓氏字符的大寫, 貨幣格式, 郵編及國際標準圖書編號(ISBN)等數據, 一般來說都會由第三方程序或用戶本身來提供的, 所以難以保證這些數據的格式是否合乎我們程序的要求。Flex Framework 本身就內建了兩個強大的類分別為Validator 和Formatter, 它們分別為各個UI 組件提供這一類型剖析及格式化的功能。接下來就是正則表逹式(Regular Expressions), 它是一個新引進入的ActionScript 語言及Flash Player 的編程工具。它強大的功能為不少用戶留下深刻的印象, 但其過于復雜的語法也使人對它又愛又恨。
Validator, 即驗證器作為一個事件發送器, 可以用來檢測Flex 控件的屬性, 以確保它可以滿足一些的預定的參數。這些參數可以以被指定為某種的格式, 例如一個屬性是否必要的或者該屬性的長度限制等。由于驗證器的高度整合性, 通過以下兩個設置, 驗證的結果可以輕易地顯示出來:
1. 設置驗證器類的事件源, 即是使用者輸入的接口。
2. 設置那些屬性會被會檢查。
驗證器會發送一個事件去控件, 根據所傳遞的事件, 這個控件會在驗證器內顯示一個自定義的錯誤信息。Flex Framework 本身已經提供了不少內建的驗證器, 例如: 信用卡號碼, 電話號碼, 電郵地址及社會安全號碼等。在這個章節里, 我們集中討論如何建設自定義的驗證器及如何將驗證器及相關事件跟控件整合。
Formatter, 以下稱為格式器, 負責一個簡單而非常重要的工作, 那就是把任何傳入的數值轉換作所指定的格式。比如將一個包含9 位連續數目的字符串轉換成一個格式化的電話號碼,那就是由555555555 轉成(555) 555-5555, 還有日期格式轉換, 或不同國家郵政編號的格式轉換等。格式器本身就為用戶定義了一個重要的方法, 那就是format(格式)。它是用來接收輸入數據以及返回一個恰當的字符串。
以上所提及的兩個類, 原則上是可以通過正則表達式(Regular Expression)來進行字符串的處理, 雖然這種方法在基礎類中是不常用的。正則表達式是一種被公認為強大, 高雅且難于應用的現代化編程開發工具。程序員可以使用這套工具去為一些特定的字符串創建各種復雜的處理規則。幾乎所有主流的編程語言都內建了正則表達式處理引擎, 雖然它們可能功能上各有分別, 但語法卻是大致相同的。所以, 正則表達式為你的作品來說絕對是一套非常實用的工具。在ActionScript 里頭, 正則表達式是以一個名為RegExp 的類來表逹的, 它包含著了兩個基礎的方法:
“test”, 是用于檢測一個字符串是否包含任何與RegExp相配的文字, 并返回一個布朗值(True/ False).
“exec”, 用于返回一個包含所有相配的項目的數組及對象, 以及包含這個事件第一次發生時所在字符串的相對位置的字符串。
正則表達式也可以通過match, search 及replace 等String 類的方法來進行檢測。當中, 我發現String 類的方法是十分有用的, 因為在正則表達式中它們允許來對個別的字符進行處理。
正則表達式是一個非常龐大的主題, 如果要對其進深入探討的話, 恐怕要用掉整本書的篇幅。
所以在本章節中, 我們只會對特定的觀點進行探討以及為一些一般性的問題提供解決方案,而不會嘗試去展示一些比較普遍的使用個案。
目錄
15.1.在TextInput及TextArea控件上使用Validator 和Formatter
15.2.如何創建一個自定義的Formatter
15.3.使用正則表達式創建國際化郵政編碼Validator
15.4.如何創建一個Validator去驗證通用商品代碼(UPC)
15.5.如何去驗證多個Combo Box及Radio Button組件
15.6.如何在一個表單內通過ToolTips來返映一個錯誤
15.7.如何使用正則表達式去定位電郵地址
15.8.如何使用正則表達式去驗證信用卡號碼
15.9.如何使用正則表達式來驗證ISBN號
15.10.如何通過指定字符類(Explicit Character Class)來創建正則表達式
15.11.如何在正則表達式中使用字符類型
15.12.如何通過子表達式來驗證IP 地址是否有效呢?
15.13.如何使用正則表達式來為不同類型進行匹配?
15.14.如何用正則表達式來為行的開端或結尾進行匹配?
15.15.如何使用逆向引用?
15.16.如何使用向前查找組或向后查找組語法?
新聞熱點
疑難解答