“正則表示式”的應用範圍越來越廣,有了這個強大的工具,我們可以做很多事情,如搜尋一句話中某個特定的資料,遮蔽掉一些非法貼子的發言,網頁中匹配特定資料,程式碼編輯框中字元的高亮等等,這都可以用正則表示式來完成。
工具/原料
電腦
易語言程式設計軟體
方法/步驟
與DOS下的萬用字元類似
其實,所謂的“正則表示式”,是大家一直在使用的,記得嗎?在搜尋檔案時,會使用一種威力巨大的武器——DOS萬用字元——“?”和“*”。這就是最常用的正則表示式。例如:
123.* 表示所有檔名為123的檔案,如123.txt, 123.doc, 123.wps, 123.swf, 123.xls等。
“中國?.doc”表示所有檔名類似於 中國1.doc、中國2.doc、中國x.doc 這樣的檔案。
上述DOS下的萬用字元用“?”號代表一個字元,“*”號代表任意個字元,但在正則表示式中,可能這些都有些改變。如“*”號匹配的就不一樣。下面看看正則表示式是如何規定的吧。
初步瞭解正則表示式的規定
正則表示式正是在“DOS萬用字元”基礎上覆雜化而得到的。其最常用的表示式可能是:
* 匹配0或多個正好在它之前的那個字元。例如a*意味著能夠匹配任意數量的a字元
. 匹配任何單個字元。例如r.t匹配這些字串:rat、rut、r t,但是不匹配root
(等同於DOS萬用字元下的?號。)
^ 匹配一行的開始。例如^When 能夠匹配字串"When in the course of human events"的開始,但是不能匹配"What and When in the"。
$ 匹配行結束符。例如正則表示式weasel$ 能夠匹配字串"He's a weasel"的末尾,但是不能匹配字串"They are a bunch of weasels."。
在這些字元中,可以使用 \. 來表示 . ,\* 表示 * ,不過,這種情況出現得很少,如果不能理解,可以暫時不理它,到用的時候就明白了。
正則表示式還有一個強大的符號:[ ],這個 [ ]所括的內容,可以不按順序進行匹配。如
[abc] 匹配abc, acb, bac, bca, cab, cba這6個文字
[0-9] 匹配任意0到9的數字
[a-z] 匹配所有小寫字母
[A-Z] 匹配所有大寫字母
當然,你可以把它們混在一起寫成[a-z0-9]這種樣子。
很多時候,我們需要檢查文字中的非數字,我們就可以使用 ^ 這個符號,表示“除了……”
[^0-9] 匹配所有非數字文字
[^a-zA-Z] 匹配所有非字母的文字
[^FONT] 匹配所有不含FONT的文字
*
前面元素出現0次以上
.
匹配任何單個字元
?
前面元素出現0次或1次
+
前面元素出現1次以上
^
表示開頭。
$
表示結尾。
.*
表示0個以上的任意字元。
[ ]
範圍描述符。[a-z]表示從a到z之間的任意一個。
\w
英文字母和數字。即[0-9 A-Z a-z]。
\W
非英文字母和數字
\s
空字元,即[\t\n\r\f]。
\S
非空字元。
\d
數字,即[0-9]。
\D
非數字。
\b
詞邊界字元(在範圍描述符外部時)
\B
非詞邊界字元
\b
退格符(0x08)(在範圍描述符內部時)
{m,n}
前面元素最少出現m次,最多出現n次
選擇
( )
群組
其他字元
該字元本身
基本的規則這些也就夠了。下面將講一講易語言中正則表示式的資料型別和幾個相關命令,相關的資料型別有兩個:正則表示式和搜尋結果。如下圖所示:
第1個正則表示式程式
新建一個易語言程式,介面設計如下圖所示:
按鈕被單擊事件程式碼如下:
.區域性變數 正則表示式1, 正則表示式
正則表示式1.建立 (“A.C”, 假)
編輯框2.內容 = 到文字 (正則表示式1.匹配 (編輯框1.內容))
如下圖所示:
在這裡,“正則表示式1”是一個正則物件,使用“建立”方法建議了一個“A.C”正則表示式,然後與編輯框1中的內容進行正則比較,最後得出結論。
執行後,大家只要輸入三個字元,前為A後為C都會返回真。如下圖所示:
但如果是小寫或多於三個字元,那麼返回就會是假。如下圖所示:
大家也許會問,這樣匹配有意義嗎?我只能說,有沒有意義只在於你怎麼用了,如:可用於程式加密時,不採用判斷語句,也不採用迴圈語句,而是用正則去匹配是否註冊成功,以及可以進行程式名稱的檢查,程式中一些文字的檢查等,這可能讓一些不會正則的破解者很難下手。
第2個正則表示式例程
通過第一個正則程式,大家會了解正則匹配的重要性,也瞭解了易語言正則支援庫的基本使用方法,下面這個例程可以讓大家瞭解正則會返回一些更多的內容,大家如何去取回這些資訊呢。下面改動上述程式中的一些程式碼為以下:
.區域性變數 正則表示式1, 正則表示式
.區域性變數 搜尋結果1, 搜尋結果, , "0"
正則表示式1.建立 (“A.C”, 假)
搜尋結果1 = 正則表示式1.搜尋全部 (編輯框1.內容)
編輯框2.內容 = 搜尋結果1 [1].取匹配文字 (編輯框1.內容, )
改動後如下所示:
在這裡,增加了一個搜尋結果的物件,用這個物件接收正則表示式匹配的結果,然後從中提取出大家想要的資料。
上述易語言程式碼的執行結果如下圖所示
改動上面編輯框的內容後,結果如下:
這次是較為重要的一環,即我們知道了取回的內容。即由A和C包含的內容。以及下面會論述到的位置資訊。取回的包含的內容意義重大,如:可以取回一對括號內的內容,這也是為了查詢的方便。
第3個例程
這次的工作任務是取一批文字中的所有字母與數字內容。
按鈕被單擊事件程式碼如下:
.區域性變數 正則表示式1, 正則表示式
.區域性變數 搜尋結果1, 搜尋結果, , "0"
.區域性變數 陣列索引, 整數型
正則表示式1.建立 (“[a-z0-9” + #換行符 + “]”, 假)
' [ ]中間的內容,就是要搜尋的內容,可以是任意字元,包括換行、空格、特殊符號.但注意如果有字元"^",就表示"除了",如"[^abc]"表示"除了abc",現在,我們給出的表示式意思是匹配含字母、數字、換行符的文字,後面那個"假"意思是不區分大小寫,你寫成真也沒有問題。
搜尋結果1 = 正則表示式1.搜尋全部 (編輯框1.內容)
' 搜尋結果是個陣列,實際上存放的是字串搜尋後的各種引數,例如位置等, 可以用"取匹配文字(,)"方法將其取出,注意它的第一個引數必須和"搜尋全部()"的引數一致
編輯框2.內容 = “”
.計次迴圈首 (取陣列成員數 (搜尋結果1), 陣列索引)
編輯框2.加入文字 (搜尋結果1 [陣列索引].取匹配文字 (編輯框1.內容, ))
.計次迴圈尾 ()
圖片如下所示:
執行後,大家可以在上面的編輯框中輸入中文與字母數字的混合,點選按鈕後,就可以從中提取出字母與數字了。執行效果如下圖所示:
一個小型的正則工具
在這裡,大家將學會製作一個小型的正則表示式工具,使用這個工具進行下面章節更加細緻的學習。
程式介面如下所示安排:
按鈕被單擊事件的程式碼如下:
.區域性變數 正則表示式1, 正則表示式
.區域性變數 搜尋結果1, 搜尋結果, , "0"
.區域性變數 位置1, 整數型
正則表示式1.建立 (組合框1.內容, 假)
.如果真 (正則表示式1.是否為空 () = 真)
連續賦值 (“”, 編輯框A.內容, 編輯框B.內容, 編輯框C.內容, 編輯框D.內容, 編輯框2.內容)
返回 ()
.如果真結束
編輯框2.內容 = 到文字 (正則表示式1.匹配 (編輯框1.內容))
搜尋結果1 = 正則表示式1.搜尋全部 (編輯框1.內容)
.如果真 (取陣列下標 (搜尋結果1, ) = 0)
連續賦值 (“”, 編輯框A.內容, 編輯框B.內容, 編輯框C.內容, 編輯框D.內容, 編輯框2.內容)
返回 ()
.如果真結束
編輯框A.內容 = 搜尋結果1 [1].取匹配文字 (編輯框1.內容, 位置1)
編輯框B.內容 = 到文字 (位置1)
編輯框C.內容 = 到文字 (位置1 + 取文字長度 (編輯框A.內容))
編輯框D.內容 = 到文字 (取文字長度 (編輯框A.內容))
抓圖如下:
通過上述程式碼後,執行效果如下:
上述是測試“匹配”方法中註釋的內容:
正則表示式.建立 (“易語言4\.0(模組 支援庫)?”)
資訊框 (正則表示式.匹配 (“易語言4.0支援庫”), 0, )
注意事項
下標從0開始還是從1開始,因當前程式語言的不同而可能不同。