微軟的Regex教程(三):字元匹配

來源:互聯網
上載者:User
一般字元

一般字元由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有標點符號以及一些符號。

最簡單的Regex是一個單獨的一般字元,可以匹配所搜尋字串中的該字元本身。例如,單字元模式 'A' 可以匹配所搜尋字串中任何位置出現的字母 'A'。這裡有一些單字元Regex模式的樣本:

/a/ /7/ /M/

等價的 VBScript 單字元Regex為:

"a" "7" "M"

可以將多個單字元組合在一起得到一個較大的運算式。例如,下面的 JScript Regex不是別的,就是通過組合單字元運算式 'a'、'7'以及 'M' 所建立出來的一個運算式。

/a7M/

等價的 VBScript 運算式為:

"a7M"

請注意這裡沒有串連操作符。所需要做的就是將一個字元放在了另一個字元後面。

特殊字元

有不少元字元在試圖對其進行匹配時需要進行特殊的處理。要匹配這些特殊字元,必須首先將這些字元轉義,也就是在前面使用一個反斜線 (/)。下表給出了這些特殊字元及其含義:

特殊字元 說明
$ 匹配輸入字串的結尾位置。如果設定了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '/n' 或 '/r'。要匹配 $ 字元本身,請使用 /$。
( ) 標記一個子運算式的開始和結束位置。子運算式可以擷取供以後使用。要匹配這些字元,請使用 /( 和 /)。
* 匹配前面的子運算式零次或多次。要匹配 * 字元,請使用 /*。
+ 匹配前面的子運算式一次或多次。要匹配 + 字元,請使用 /+。
. 匹配除分行符號 /n之外的任何單字元。要匹配 .,請使用 /。
[ 標記一個中括號運算式的開始。要匹配 [,請使用 /[。
? 匹配前面的子運算式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 /?。
/ 將下一個字元標記為或特殊字元、或原義字元、或後向引用、或八進位轉義符。例如, 'n' 匹配字元 'n'。'/n' 匹配分行符號。序列 '//' 匹配 "/",而 '/(' 則匹配 "("。
^ 匹配輸入字串的開始位置,除非在方括號運算式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 /^。
{ 標記限定符運算式的開始。要匹配 {,請使用 /{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 /|。


非列印字元

有不少很有用的非列印字元,偶爾必須使用。下表顯示了用來表示這些非列印字元的逸出序列:

字元 含義
/cx 匹配由x指明的控制字元。例如, /cM 匹配一個 Control-M 或斷行符號符。 x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
/f 匹配一個換頁符。等價於 /x0c 和 /cL。
/n 匹配一個分行符號。等價於 /x0a 和 /cJ。
/r 匹配一個斷行符號符。等價於 /x0d 和 /cM。
/s 匹配任何空白字元,包括空格、定位字元、換頁符等等。等價於 [ /f/n/r/t/v]。
/S 匹配任何非空白字元。等價於 [^ /f/n/r/t/v]。
/t 匹配一個定位字元。等價於 /x09 和 /cI。
/v 匹配一個垂直定位字元。等價於 /x0b 和 /cK。


字元匹配

句點 (.) 匹配一個字串中任何單個的列印或非列印字元,除了分行符號 (/n) 之外。下面的 JScript Regex可以匹配 'aac'、'abc'、'acc'、'adc'如此等等,同樣也可以匹配 'a1c'、'a2c'、a-c'以及 a#c':

/a.c/

等價的 VBScript Regex為:

"a.c"

如果試圖匹配一個包含檔案名稱的字串,其中句點 (.) 是輸入字串的一部分,則可以在Regex中的句點前面加上一個反斜線 (/) 字元來實現這一要求。舉例來說,下面的 JScript Regex就能匹配 'filename.ext':

/filename/.ext/

對 VBScript 而言,等價的運算式如下所示:

"filename/.ext"

這些運算式仍然是相當有限的。它們只允許匹配任何單字元。很多情況下,對從列表中匹配特殊字元十分有用。例如,如果輸入文字中包含用數字表示為Chapter 1, Chapter 2諸如此類的章區段標頭,你可能需要找到這些章區段標頭。

括號運算式

可以在一個方括弧 ([ 和 ]) 中放入一個或多個單字元,來建立一個待匹配的列表。如果字元被放入括弧中括起來,則該列表稱為括號運算式。括弧內和其他任何地方一樣,一般字元代表其本身,也就是說,它們匹配輸入文字中出現的一處自己。大多數特殊字元在位於括號運算式中時都將失去其含義。這裡有一些例外:

  • ']' 字元如果不是第一項,則將結束一個列表。要在列表中匹配 ']' 字元,請將其放在第一項,緊跟在開始的 '[' 後面。
  • '/' 仍然作為轉義符。要匹配 '/' 字元,請使用 '//'。

括號運算式中所包含的字元只匹配該括號運算式在Regex中所處位置的一個單字元。下面的 JScript Regex可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 以及 'Chapter 5':

/Chapter [12345]/

在 VBScript 中要匹配同樣的章區段標頭,請使用下面的運算式:

"Chapter [12345]"

請注意單詞 'Chapter' 及後面的空格與括弧內的字元的位置關係是固定的。因此,括號運算式只用來指定滿足緊跟在單詞 'Chapter' 和一個空格之後的單字元位置的字元集合。這裡是第九個字元位置。

如果希望使用範圍而不是字元本身來表示待匹配的字元,則可以使用連字號將該範圍的開始和結束字元分開。每個字元的字元值將決定其在一個範圍內的相對順序。下面的 JScript Regex包含了一個等價於上面所示的括弧列表的範圍運算式。

/Chapter [1-5]/

VBScipt 中相同功能的運算式如下所示:

"Chapter [1-5]"

如果以這種方式指定範圍,則開始和結束值都包括在該範圍內。有一點特別需要注意的是,在 Unicode 排序中起始值一定要在結束值之前。

如果想在括號運算式中包括連字號,則必須使用下述方法之一:

  • 使用反斜線將其轉義:
    [/-]
  • 將連字號放在括弧列表的開始和結束位置。下面的運算式能匹配所有的小寫字母和連字號:
    [-a-z] [a-z-]
  • 建立一個範圍,其中開始字元的值小於連字號,而結束字元的值等於或大於連字號。下面兩個Regex都滿足這一要求:
    [!--] [!-~]

同樣,通過在列表開始處放置一個插入符(^),就可以尋找所有不在列表或範圍中的字元。如果該插入符出現在列表的其他位置,則匹配其本身,沒有任何特殊含義。下面的 JScript Regex匹配章節號大於 5 的章區段標頭:

/Chapter [^12345]/

對 VBScript 則使用:

"Chapter [^12345]"

在上面所示的樣本中,運算式將匹配第九個位置處除1, 2, 3, 4, or 5 之外的任何數字字元。因此, 'Chapter 7' 為一個匹配,同樣 'Chapter 9' 也是如此。

上面的運算式可以使用連字號 (-) 表示。對 JScript 為:

/Chapter [^1-5]/

或者,對 VBScript 為:

"Chapter [^1-5]"

括號運算式的典型用法是指定對任何大寫或小寫字母字元或任何數位匹配。下面的 JScript 運算式給出了這一匹配:

/[A-Za-z0-9]/

等價的 VBScript 運算式為:

"[A-Za-z0-9]"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.