祝平次的教學網站- Regular Expression (正[則規]表[達示]式)

文章推薦指數: 80 %
投票人數:10人

Regular Expression (正[則規]表[達示]式) ... 請注意RegEx中用的符號都是半型。

... 如果設定了RegExp物件的Multiline屬性,^也符合「\n」或「\r」之後的位置。

SearchthissiteSkiptomaincontentSkiptonavigationRegularExpression(正[則規]表[達示]式)以下由維基的表格改寫,請大家利用寄給大家的練習資料夾(data)中的子資料夾「莊子」進行練習。

第一層表示的是,輸入的正則表示式。

請打開Notepad++請在功能列點選「檢視(V)」,然後點選「文件夾工作區(W)」來打開文件夾工作區(在視窗左邊)。

將滑鼠移到文件夾工作區的空白處,按下滑鼠右鍵;待小視窗跳出來後,點選視窗中的「Add」,然後利用資料夾選擇視窗,選擇下載並解壓縮的data資料夾。

然後按一下data資料夾前的「+」號,來展開子資料夾。

子資料夾中的「莊子」,就是我們要用來練習的材料。

請將滑鼠游標移到「莊子」子資料夾,並按一下滑鼠右鍵;待小視窗跳出時,點選第二項「FindinFiles」待「FileinFiles」檢索視窗在螢幕中間出現時,點選此檢索視窗左下角的「規則運算式」,然後利用「尋找內容」後面的欄位,來輸入我們下面練習的正則表達式(RegularExpression),然後按下「全部尋找」來看下面正則表達式的結果。

逍如果輸入一個字詞,就和我們平常使用的檢索沒有什麼不同。

檢索「逍」,可以在5個檔案裏,找到6次(6hitsin5files)逍遙檢索「逍遙」,也可以在5個檔案裏,找到6次。

所以我們知道,在《莊子》裏,「逍」只會和「遙」一起出現。

[逍遙][]方括號,表示找的是方括號裏任何一個字元:所以在我們的例子裏,會找出所有的「逍」字和「遙」字。

請注意RegEx中用的符號都是半型。

檢索「[逍遙]」,也可以在7個檔案裏,找到14次。

配合上面的結果,我們可以推測出,在其它2個檔案裏,「遙」各出現1次。

[逍遙遊]大檢索「[逍遙遊]」,也可以在51個檔案裏,找到95次。

配合上面的結果,我們可以推測出,「遊」總共出現81次。

逍遙遊檢索「逍遙遊」,在0個檔案裏,發現0次。

「逍遙遊」雖然是《莊子》首篇的篇名,但並沒有成為三字詞出現在內文裏。

[逍遙]之如果我們把一個一般檢索的「之」字和選擇任何一個字元的「[逍遙]」,會找出所有的「逍之」和「遙之」。

檢索「[逍遙]之」,可以在1個檔案裏,找到1次。

蜩|學鳩如果要找的是一個或一個字元以上的字詞,我們使用的是半型的「|」。

檢索「蜩|學鳩」,可以找到「蜩」或「學鳩」,亦即找出所有的「蜩」與「學鳩」;在5個檔案裏,可以找到9次。

(蜩|學鳩)笑如果要把「蜩|學鳩」和一個一般的檢索字詞連在一起,比如說「笑」合成一個正則表示式,找出所有的「蜩笑」或「學鳩笑」,我們必須利用半型括號先把「蜩|學鳩」括起來,做為複合型的一個部分,否則我們會打成「蜩|學鳩笑」,找出來的會是「蜩」與「學鳩笑」而不是「蜩笑」與「學鳩笑」。

()可以幫我們組成群組,也可以讓複合式的正則表示式更容易理解。

也因為()可以把不同的部分群組起來,所以可以讓正則表示式可以累聚起來成為更複雜的樣式,功能也就更強大。

例如:「[逍遙](之(蜩|學鳩)笑)」會先找出「逍」或「遙」字,再找出括號中的「之蜩笑」或「之學鳩笑」;合併起來的結果,就是會找出:1)「逍之蜩笑」;2)「遙之蜩笑」;3)「逍之學鳩笑」;4)「遙之學鳩笑」。

另外,部分的正則表示式群組起來以後,就可以用代碼來指稱它們。

同樣的這也大大增加了正則表示式的功能,也讓正則表示式的「取代」的功能可以較抽象化的進行,而不是只能以一般字詞來做為取代的內容。

(下面還會詳細說明。

)()依照順序,代碼分別是\1、\2、\3、\4…例如在「[逍遙](之(蜩|學鳩)笑)」的例子裏。

「\1」是代表最外面括號裏的東西,也就是「之(蜩|學鳩)笑」而「\2」代表的就是裏面的括號內的東西,也就是「蜩|學鳩」。

所以如果我們「[逍遙](之(蜩|學鳩)笑)」改寫成「[逍遙](之(蜩|學鳩)笑)\2」,就會找出:1)「逍之蜩笑蜩」;2)「遙之蜩笑蜩」;3)「逍之學鳩笑蜩」;4)「遙之學鳩笑蜩」;5)「逍之蜩笑學鳩」;6)「遙之蜩笑學鳩」;7)「逍之學鳩笑學鳩」;8)「遙之學鳩笑學鳩」。

================以下尚未編輯:現在讓我們打開一個檔案字元描述\共計12個)、或一個向後參照(backreferences)、或一個八進位轉義符。

例如,「n」符合字元「n」。

「\n」符合一個換行符。

序列「\\」符合「\」而「\(」則符合「(」。

^符合輸入字串的開始位置。

如果設定了RegExp物件的Multiline屬性,^也符合「\n」或「\r」之後的位置。

$符合輸入字串的結束位置。

如果設定了RegExp物件的Multiline屬性,$也符合「\n」或「\r」之前的位置。

*符合前面的子運算式零次或多次。

例如,zo*能符合「z」、「zo」以及「zoo」。

*等價於{0,}。

+符合前面的子運算式一次或多次。

例如,「zo+」能符合「zo」以及「zoo」,但不能符合「z」。

+等價於{1,}。

?符合前面的子運算式零次或一次。

例如,「do(es)?」可以符合「do」或「does」中的「do」。

?等價於{0,1}。

{n}n是一個非負整數。

符合確定的n次。

例如,「o{2}」不能符合「Bob」中的「o」,但是能符合「food」中的兩個o。

{n,}n是一個非負整數。

至少符合n次。

例如,「o{2,}」不能符合「Bob」中的「o」,但能符合「foooood」中的所有o。

「o{1,}」等價於「o+」。

「o{0,}」則等價於「o*」。

{n,m}m和n均為非負整數,其中n<=m。

最少符合n次且最多符合m次。

例如,「o{1,3}」將符合「fooooood」中的前三個o。

「o{0,1}」等價於「o?」。

請注意在逗號和兩個數之間不能有空格。

?非貪心量化(Non-greedyquantifiers):當該字元緊跟在任何一個其他重複修飾詞(*,+,?,{n},{n,},{n,m})後面時,符合模式是非貪婪的。

非貪婪模式儘可能少的符合所搜尋的字串,而預設的貪婪模式則儘可能多的符合所搜尋的字串。

例如,對於字串「oooo」,「o+?」將符合單個「o」,而「o+」將符合所有「o」。

.符合除「\n」之外的任何單個字元。

要符合包括「\n」在內的任何字元,請使用像「(.|\n)」的模式。

(pattern)符合pattern並取得這一符合的子字串。

該子字串用於向後參照。

所取得的符合可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。

要符合圓括號字元,請使用「\(」或「\)」。

(?:pattern)符合pattern但不取得符合的子字串(shygroups),也就是說這是一個非取得符合,不儲存符合的子字串用於向後參照。

這在使用或字元「(|)」來組合一個模式的各個部分是很有用。

例如「industr(?:y|ies)」就是一個比「industry|industries」更簡略的運算式。

(?=pattern)正向肯定預查(lookaheadpositiveassert),在任何符合pattern的字串開始處符合尋找字串。

這是一個非取得符合,也就是說,該符合不需要取得供以後使用。

例如,「Windows(?=95|98|NT|2000)」能符合「Windows2000」中的「Windows」,但不能符合「Windows3.1」中的「Windows」。

預查不消耗字元,也就是說,在一個符合發生後,在最後一次符合之後立即開始下一次符合的搜尋,而不是從包含預查的字元之後開始。

(?!pattern)正向否定預查(negativeassert),在任何不符合pattern的字串開始處符合尋找字串。

這是一個非取得符合,也就是說,該符合不需要取得供以後使用。

例如「Windows(?!95|98|NT|2000)」能符合「Windows3.1」中的「Windows」,但不能符合「Windows2000」中的「Windows」。

預查不消耗字元,也就是說,在一個符合發生後,在最後一次符合之後立即開始下一次符合的搜尋,而不是從包含預查的字元之後開始(?<=pattern)反向(lookbehind)肯定預查,與正向肯定預查類似,只是方向相反。

例如,「(?<=95|98|NT|2000)Windows」能符合「2000Windows」中的「Windows」,但不能符合「3.1Windows」中的「Windows」。

(?



請為這篇文章評分?