通用運算式【一】pattern


Tek 發表



瞭解VBScript處理字串的精華

通用運算式(Regular Expression)是一個非常強大且廣用的物件• 如果你完全沒有頭緒為什麼有很多論壇有自動連結、自創語法(GB 語法之類)等那麼強的字串處理的功能,這一篇文章將可以帶給您很大的幫助! 創造屬於自己的論壇語法再也不是什麼學不來的事情了• 這一項教學文章主要分為兩篇來講,分別為該物件的 pattern 模式和方法(method)參考• 另外雖然通用運算式可用在ASPVBScript上(ASP的預設語言),但為了方便我還是直接以VBScript當作範本參考• 如果您缺少VBScript的基本經驗,那麼這一個教學可能不適合您•

【一】實際範例: 使用RegEXP 物件

以下將會是所有例子的原始碼範例,綠字部份代表是您這一次主要會學到的地方• 要使用的話,只要給予一個新的 pattern 和一個要被搜尋的新字串就可以了•


<Script Language="VBS">
'Coded by Tek
Option Explicit
Sub regular_exp(s_strg, patternstr)
' 參數s_strg 是原字串 ,patternstr 是pattern的設定值
If s_strg <> "" And patternstr <> "" Then
Dim regex, match, matches
Set regex = New RegExp
With regex
.IgnoreCase = True ' 不理會英文大小寫問題
.Global = True ' 比對整個字串中所有符合的項目
.Pattern = patternstr ' 運算式模式
End With
Set matches = regex.Execute(s_strg)
For Each match In matches
document.write match.value & "<br>" ' 寫出結果
Next
End If
End Sub

</Script>

需要呼叫這一個 Subroutine,您可以在 End Sub 的下一行使用 Call() 來啟動,這是一個例子:

call(regular_exp("我的電話號碼是123-4567沒用分機", "\d{3}-\d{4}"))

我使用的 pattern 是在一個字串中尋找有電話文字格式的字串,所以我會得到這結果:

123-4567

【二】設定: pattern 模式設定介紹

VBScript 5.6 總共有32個pattern字元可使用•在設定pattern時,您可以一般文字設定值字串混在一起使用,程式會自己依照您給予與的pattern去自動辨識搜尋• 以下的範例我可能寫的有點複雜(事實上這些範例還不夠完美,不過那暫時不講,否則真的又會更囉嗦),但我有另外寫註解•有些想通了可以解決很多你想要創造自己論壇語法的困擾•) 看不懂的話慢慢看還是自然會懂的 :-) 另外,過於簡單的字元沒範例• 等有需要我會再另外update:

字元

說明 pattern 範例
\ 標示下一個字元為特殊字元或文字,例如 n 對應字元 n,\n 則對應至換行字元。順序 \\ 對應 \,\( 則對應 (。 \([a-z]{1,}\)
註: 抓字串中被 ( ) 起來的英文字母(只限英文字)
^ 對應輸入的開頭 ^n
註:抓整個字串中第一個為n開頭的字
$ 對應輸入的結尾 $n
註:抓整個字串中最後一個為n開頭的字
* 對應前面的字元 0 次或更多次 \[img\]*http://[a-z0-9./%\?_-]{1,}\.[a-z]{1,}\[/img]
註:在整個字串中尋找以[img]http://圖片網址[/img]內容的資料•例如: [img]http://www.microsoft.com/bill.gif[/img] 就是一個完全符合的結果
+ 對應前面的字元一次或更多次 \d+
註:從一個字串中找所有數字
? 對應前面的字元 0 次或一次 <img src=["|"|']?[a-z0-9./%\?_-]{1,}\.[a-z]{1,}["\|"\|']?>
註:從一個字串中抓使限使用src attribute的HTML貼圖語法•注意如果這一個pattern是寫在 " " 裡面的話則需要把pattern裡的 " 改成 ""
. 對應換行字元以外的任何單一字元。 \d.
註:從一字串中尋找任何兩字元長度以下的數字(長度到二包括在內)
(pattern) 比對模式並記錄符合的項目。對應的子字串可透過「項目」[0]...[n],從結果的 Matches 集合中擷取。若要對應括弧字元 (),請使用 \( 或 \)。 ([1-2]?[0-9]?[0-9])\.([1-2]?[0-9]?[0-9]\.){2}([1-2]?[0-9]?[0-9])
註:從一字串中搜尋 IP 資料 (這需在搜尋後另外使用if...else...end if 判斷IP的Range來增加正確性)
x|y 對應 x 或 y• 天|地+
註:從一字串中找數字天或地的文字部份
{n} n 是一個正整數,必須完全對應 n 次。 \d{3}-\d{4}
註:從一字串中搜尋前三字元,後四字元的電話號碼• 例如: 412-5555
{n,} n 是一個正整數,至少應對應 n 次。 a{2,}
註: 從一字串中搜尋 aa 這兩個字元
{n,m} m 和 n 都是正整數,至少應對應 n 次,最多 m 次。 ([a-z0-9\-_]){1,}@([a-z0-9\.\-]){1,}\.[a-z]{2,3}(\.[a-z]{1,})*
註:從一個字串中搜尋電子郵件的pattern
[xyz] 這是一個字元集,可對應任何一個括住的字元。 [(@_@)(^_^)(>_<)(X_X)]
註:直接從整個字串中搜尋好幾個文字臉部表情
[^xyz] 這是一個負的字元集,對應任何未括住的字元。 [^(@_@)^(^_^)^(>_<)^(X_X)]
註:除了特定的幾個表字踢除以外,選取所有文字
[a-z] 這是一個字元範圍,對應指定範圍內的任何字元。 [0-9]
註:找0以上9以內的字元
[^m-z] 這是一個負的字元範圍,對應指定範圍外的任何字元。 [^a-z]{1,}
註: 搜尋 a-z 以外的字元• 注意有{1,}在的話會以句子或詞的方式顯示出來結果,拿掉就會一個一個顯示•
\b 對應一個文字界緣 (word boundary),也就是文字和空格之間的位置。 (\d{1,})\b
註:從一字串中找尾巴是數字的結果(請再注意有{1,}和沒{1,}的差別)
\B 對應一個非文字界緣。ea*r\B 可對應 never early 中的 ear。 (這我想說明應該很容易瞭解吧?)
\d 對應數字字元,相當於 [0-9]。 (這個方法您可以參考我寫過的範例,都有重覆使用)
\D 對應非數字字元,相當於 [^0-9]。 (這我想說明應該很容易瞭解吧?)
\f 對應一個換頁字元。 (無)
\n 對應一個換行字元。 (無)
\r 對應一個復位字元。 (無)
\s 對應任何空白,包括空格、定位 (tab) 和換頁等等,相當於 [ \f\n\r\t\v]。 (如果您想要寫一個像XML寫法那樣的語法的話,就可以直接多套用這一個)
\S 對應任何非空白字元,相當於 [^ \f\n\r\t\v]。 (無)
\t 對應一個定位字元。 (無)
\v 對應一個垂直定位字元。 (無)
\w 對應包括底線在內的任何文字字元,相當於 [A-Za-z0-9_]。 (無)
\W 對應任何非文字字元,相當於 [^A-Za-z0-9_]。 (無)
\num 對應 num,此處的 num 是一個正整數。它是一個回到記憶符合項目的參考。例如,(.)\1 可對應兩個連續的相同字元。 (旁邊已經有充分的說明)
\n 對應 n,此處的 n 是一個八進位的 escape 值。八進位的 escape 值必須等於 1、2 或 3 個數字的長度。例如 \11 和 \011 都可對應一個定位字元。\0011 相當於 \001 與 1。八進位的 escape 值不得超過 256,否則運算式只會使用前兩個數字。這個字元可讓通用運算式能使用 ASCII 程式碼。 (旁邊已經有充分的說明)
\xn 對應 n,此處的 n 是一個十六進位的 escape 值。十六進位的 escape 值必須正好等於 2 個數字的長度。例如 \x41 可對應 A。\x041 相當於 \x04 與 1。這個字元可讓通用運算式能使用 ASCII 程式碼。 (旁邊已經有充分的說明)

To be continued...

最後更新日期: 7/7/2003 9:14:28 AM