易語言-正則表示式入門?

“正則表示式”的應用範圍越來越廣,有了這個強大的工具,我們可以做很多事情,如搜尋一句話中某個特定的資料,遮蔽掉一些非法貼子的發言,網頁中匹配特定資料,程式碼編輯框中字元的高亮等等,這都可以用正則表示式來完成。

易語言-正則表示式入門

工具/原料

電腦

易語言程式設計軟體

方法/步驟

與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開始,因當前程式語言的不同而可能不同。

相關問題答案