微軟的正規表示式教程(四)

2021-04-12 13:45:44 字數 3664 閱讀 5980

有時候不知道要匹配多少字元。為了能適應這種不確定性,正規表示式支援限定符的概念。這些限定符可以指定正規表示式的乙個給定元件必須要出現多少次才能滿足匹配。

下表給出了各種限定符及其含義的說明:

字元 描述 * 匹配前面的子表示式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等價於。 + 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 。 ? 匹配前面的子表示式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 。

n 是乙個非負整數。匹配確定的

n 次。例如,'o' 不能匹配 "bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

n 是乙個非負整數。至少匹配

n 次。例如,'o' 不能匹配 "bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o' 等價於 'o+'。'o' 則等價於 'o*'。

m 和

n 均為非負整數,其中

n<=

m。最少匹配

n 次且最多匹配

m 次。劉, "o" 將匹配 "fooooood" 中的前三個 o。'o' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

/chapter [1-9][0-9]*/
下面的 vbscript 正規表示式執行同樣的匹配:

"chapter [1-9][0-9]*"
請注意限定符出現在範圍表示式之後。因此,它將應用於所包含的整個範圍表示式,在本例中,只指定了從 0 到 9 的數字。

這裡沒有使用 '+' 限定符,因為第二位或後續位置上並不一定需要乙個數字。同樣也沒有使用 '?' 字元,因為這將把章節數限制為只有兩位數字。在 'chapter' 和空格字元之後至少要匹配乙個數字。

如果已知章節數限制只有99 章,則可以使用下面的 jscript 表示式來指定至少有一位數字,但不超過兩個數字。

/chapter [0-9]/
對 vbscript 可以使用下述正規表示式:

"chapter [0-9]"
上述表示式的缺點是如果有乙個章節號大於 99,它仍只會匹配前兩位數字。另乙個缺點是某些人可以建立乙個 chapter 0,而且仍能匹配。乙個更好的用來匹配兩位數的 jscript 表示式如下:

/chapter [1-9][0-9]?/
或者

/chapter [1-9][0-9]/
對 vbscript 而言,下述表示式與上面等價:

"chapter [1-9][0-9]?"
或者

"chapter [1-9][0-9]"
'*'、 '+'和 '?'限定符都稱之為貪婪的,也就是說,他們盡可能多地匹配文字。有時這根本就不是所希望發生的情況。有時則正好希望最小匹配。

例如,你可能要搜尋乙個 html 文件來查詢一處包含在 h1 標記中的章節標題。在文件中該文字可能具有如下形式:

下面的表示式匹配從開始的小於號 (<) 到 h1 標記結束處的大於號之間的所有內容。

/<.*>/
vbscript 的正規表示式為:

"<.*>"
如果所要匹配的就是開始的 h1 標記,則下述非貪婪地表示式就只匹配 。

/<.*?>/
或者

"<.*?>"
通過在 '*'、 '+' 或 '?' 限定符後放置 '?',該表示式就從貪婪匹配轉為了非貪婪或最小匹配。

到現在為止,所看到的示例都只考慮查詢任何地方出現的章節標題。出現的任何乙個字串 'chapter' 後跟乙個空格和乙個數字可能是乙個真正的章節標題,也可能是對其他章節的交叉引用。由於真正的章節標題總是出現在一行的開始,因此需要設計乙個方法只查詢標題而不查詢交叉引用。

定位符提供了這個功能。定位符可以將乙個正規表示式固定在一行的開始或結束。也可以建立只在單詞內或只在單詞的開始或結尾處出現的正規表示式。下表包含了正規表示式及其含義的列表:

字元 描述 ^ 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,^ 也匹配 '/n' 或 '/r' 之後的位置。 $ 匹配輸入字串的結束位置。如果設定了regexp物件的multiline屬性,$ 也匹配 '/n' 或 '/r' 之前的位置。 /b 匹配乙個單詞邊界,也就是指單詞和空格間的位置。 /b 匹配非單詞邊界。

不能對定位符使用限定符。因為在乙個換行符或者單詞邊界的前面或後面不會有連續多個位置,因此諸如 '^*' 的表示式是不允許的。

要匹配一行文字開始位置的文字,請在正規表示式的開始處使用 '^' 字元。不要把 '^' 的這個語法與其在括號表示式中的語法弄混。它們的語法根本不同。

要匹配一行文字結束位置的文字,請在正規表示式的結束處使用 '$' 字元。

/^chapter [1-9][0-9]/
vbscript 中相同功能的正規表示式如下:

"^chapter [1-9][0-9]"
乙個真正的章節標題不僅出現在一行的開始,而且這一行中也僅有這乙個內容,因此,它必然也位於一行的結束。下面的表示式確保所指定的匹配只匹配章節而不會匹配交叉引用。它是通過建立乙個只匹配一行文字的開始和結束位置的正規表示式來實現的。

/^chapter [1-9][0-9]$/
對 vbscript 則使用:

"^chapter [1-9][0-9]___fckpd___16quot;
匹配單詞邊界有少許不同,但卻給正規表示式增加了乙個非常重要的功能。單詞邊界就是單詞和空格之間的位置。非單詞邊界就是其他任何位置。下面的 jscript 表示式將匹配單詞 'chapter' 的前三個字元,因為它們出現在單詞邊界後:

//bcha/
對 vbscript 為:

"/bcha"
這裡 '/b' 操作符的位置很關鍵。如果它位於要匹配的字串的開始,則將查詢位於單詞開頭處的匹配;如果它位於改字串的末尾,則查詢位於單詞結束處的匹配。例如,下面的表示式將匹配單詞 'chapter' 中的 'ter',因為它出現在單詞邊界之前:

/ter/b/
以及

"ter/b"
下面的表示式將匹配 'apt',因為它位於 'chapter' 中間,但不會匹配 'aptitude' 中的'apt':

//bapt/
以及

"/bapt"
這是因為在單詞 'chapter' 中 'apt' 出現在非單詞邊界位置,而在單詞 'aptitude' 中位於單詞邊界位置。非單詞邊界操作符的位置不重要,因為匹配與乙個單詞的開頭或結尾無關。

微軟的正規表示式教程(一) 正規表示式簡介

微軟的正規表示式教程 一 正規表示式簡介 認識正規表示式 如果原來沒有使用過正規表示式,那麼可能對這個術語和概念會不太熟悉。不過,它們並不是您想象的那麼新奇。請回想一下在硬碟上是如何查詢檔案的。您肯定會使用 和 字元來幫助查詢您正尋找的檔案。字元匹配檔名中的單個字元,而 則匹配乙個或多個字元。乙個如...

正規表示式 教程

引言 什麼是正規表示式?準備工作 匹配單個字元 匹配固定單個字元 匹配任意單個字元 匹配 元字元 匹配字元組 字元組的基本語法 在字元組中使用字元區間 反義字元組 匹配特殊字元7 匹配元字元 匹配空字元 匹配特定字元型別9 匹配數字型別 匹配字母 數字 下劃線 匹配空字元 匹配多個字元 匹配乙個或多...

正規表示式教程

正規表示式定義 正規表示式應用 正規表示式建立 第一種方式 var exeg new regexp 檢索內容 修飾符 第二種方式 var exeg 檢索內容 修飾符 正規表示式的使用 第一種方式 var str hello wolrd var exeg new regexp e console.lo...