目標文本中恰好由所列順序的那些字符組合的任何文本都將匹配。小寫字符與其大寫字符不同,反之亦然。另外,規則表達式中的空格與目標文本中的空格文字匹配(這與大多數編程語" name="description" />
目標文本中恰好由所列順序的那些字符組合的任何文本都將匹配。小寫字符與其大寫字符不同,反之亦然。另外,規則表達式中的空格與目標文本中的空格文字匹配(這與大多數編程語言或命令行工具不同,后者的空格用來分隔關鍵字)。
/a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/Mary/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
對于規則表達式來說,許多字符具有特殊含義。具有特殊含義的符號也可以被匹配,但是要這樣做,必須用反斜杠字符作前綴(這包括反斜杠字符本身:要匹配目標文本中的反斜杠,規則表達式應該包括 "\")。
/.*/
Special characters must be escaped.*
/\.\*/
Special characters must be escaped.*
幾乎在所有規則表達式工具中都使用兩個特殊字符來標記行首和行尾:插入符號 (^) 和美元符號 ($)。要將插入符號或美元符號作為字符文字匹配,必須將其轉義(即加以反斜杠 "\" 前綴)。
關于插入符號和美元符號的一件趣事是:它們匹配零寬度模式。也就是說,插入符號或美元符號本身所匹配的字符串長度為零(但是規則表達式的其余部分仍能夠依賴于零寬度匹配)。很多規則表達式工具提供另一種字邊界零寬度模式 (\b)。字可能由空白(如空格、制表符、新行或類似于空字符的其它字符)隔開;字邊界模式與字開始或結束的實際位置匹配,而不是匹配某個特殊空白字符。
/^Mary/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/Mary$/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
在規則表達式中,句點可以代表任何字符。通常,不包括新行字符,但是大多數工具還有可選開關來強制包括新行字符。在模式中使用句點是一種要求在此處出現“某事”,但無需確定是何事的方法。
熟悉 DOS 命令行通配符的用戶將知道:問號充當命令掩碼中“某個”字符的角色。但在規則表達式中,問號有不同的含義,而句點則作為通配符使用。
/.a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
規則表達式中可以有文字字符,還可以有零寬度位置模式。每一個字符文字或位置模式都是規則表達式中的一個原子。還可以將幾個原子一起組合成一個小的規則表達式作為更大規則表達式的一部分??赡苡腥嗽敢鈱⑦@樣的組合稱為“分子”,但通常還是將其稱為原子。
在較早的面向 UNIX 工具中,如 grep,必須用轉義圓括號將子表達式組合在一起,譬如 /\(Mary\)/
。在 Perl 和大多數較新的工具(包括 egrep)中,只用圓括號組合,但是匹配字面上的圓括號需要在模式中將其轉義(示例采用 Perl 風格)。
/(Mary)( )(had)/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
您不僅可以只命名一個字符,還可以在規則表達式中包括一個與任何字符集匹配的模式。
可以在方括號中使用字符集作為簡單列表,例如,/[aeiou]/
將匹配任何一個小寫元音字母。對于一定范圍的字母或數字,還可以只使用范圍中的第一個和最后一個字母,并在中間加上破折號,例如,/[A-Ma-m]/
將匹配字母表前半部分的任何小寫或大寫字母。
很多規則表達式工具還為最常用的字符類提供轉義風格的快捷方式,例如,\w
代表空白字符,\d
代表數字。您可以隨時用方括號定義這些字符類,但是,快捷方式可以使規則表達式更簡短和更易懂。
/[a-z]a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
實際上,插入符號在規則表達式中可以有兩種不同的含義。通常,它表示匹配行首的零長度模式。但是如果在字符類的開始處使用它,則它反轉字符類的含義。將匹配所有不包括在所列字符集中的文本。
/[^a-z]a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
使用字符類是指明兩種字符之一在特定地方出現的一種方式。但是,如果要在規則表達式中指定兩個子表達式之一要在某個位置出現時該怎么辦呢?在那種情況下,可以使用交替運算符,豎線 ("|")。這也是在 UNIX/DOS shell 中用于指明管道的符號,也被稱為管道符。
規則表達式中的管道符表明在包圍它的所有事物之間進行交替。即使管道符的左右兩邊有幾個組,交替操作也會“貪心”地請求兩邊的所有文本。要選擇交替的范圍,必須定義一個組,該組應包圍可以匹配的模式。示例說明了這一點。
/cat|dog|bird/
The pet store sold cats, dogs, and birds.
/=xxx|yyy=/
=xxx xxx= # =yyy yyy= # =xxx= # =yyy=
/(=)(xxx)|(yyy)(=)/
=xxx xxx= # =yyy yyy= # =xxx= # =yyy=
/=(xxx|yyy)=/
=xxx xxx= # =yyy yyy= # =xxx= # =yyy=
可以用規則表達式做的最強大和最常見的事情是指定原子在整個規則表達式中出現幾次。有時,您想指定單一字符的出現次數,但是通常,您對指定字符類或組合的子表達式的出現次數會更感興趣。
“基本”規則表達式語法只包括一個量詞,即星號 ("*");這表示“一些或沒有”或“零或多個”。如果要指定任何數量的原子可以作為模式的一部分出現,請在原子后面加上星號。
如果沒有量詞,規則表達式實際上就沒有太大用處,但是一旦將量詞添加到子表達式,就可以從整體上描述子表達式的出現。請看一下示例。
/@(=+=)*@/
Match with zero in the middle: @@
Subexpression oclearcase/" target="_blank" >ccurs, but...: @=+=ABC@
Many occurrences: @=+==+==+==+==+=@
Repeat entire pattern: @=+==+=+==+=@