目标文本中恰好由所列顺序的那些字符组合的任何文本都将匹配。小写字符与其大写字符不同,反之亦然。另外,规则表达式中的空格与目标文本中的空格文字匹配(这与大多数编程语" 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: @=+==+=+==+=@