正则表达式使用指南二

来源:互联网 发布:塑料箱子淘宝 编辑:程序博客网 时间:2024/05/02 02:34
下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 说明
/ 转义符
(), (?:), (?=), [] 括号和中括号
, +, ?, {n}, {n,}, {n,m} 限定符
^, $, /anymetacharacter, anycharacter 定位点和序列
| 替换

    字符的优先级比替换运算符高,替换运算符允许“m|food”与“m”或“food”匹配。若要匹配“mood”或“food”,请使用括号创建子表达式,从而产生“(m|f)ood”。


    普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

    正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,如 A,不论出现在搜索字符串中的何处,它总是匹配字母 A。下面是一些单字符正则表达式模式的示例:

/a/
/7/
/M/
    可以将许多单字符组合起来以形成大的表达式。例如,以下正则表达式组合了单字符表达式:a、7 和 M。

/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)。下面的正则表达式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:

/a.c/
    若要匹配包含文件名的字符串,而句点 (.) 是输入字符串的组成部分,请在正则表达式中的句点前面加反斜扛 (/) 字符。举例来说明,下面的正则表达式匹配 filename.ext:

/filename/.ext/
    这些表达式只让您匹配“任何”单个字符。可能需要匹配列表中的特定字符组。例如,可能需要查找用数字表示的章节标题(Chapter 1、Chapter 2 等等)。

中括号表达式
    若要创建匹配字符组的一个列表,请在方括号([ 和 ])内放置一个或更多单个字符。当字符括在中括号内时,该列表称为“中括号表达式”。与在任何别的位置一样,普通字符在中括号内表示其本身,即,它在输入 文本中匹配一次其本身。大多数特殊字符在中括号表达式内出现时失去它们的意义。不过也有一些例外,如:

    如果 ] 字符不是第一项,它结束一个列表。若要匹配列表中的 ] 字符,请将它放在第一位,紧跟在开始 [ 后面。
/ 字符继续作为转义符。若要匹配 / 字符,请使用 //。 
    括在中括号表达式中的字符只匹配处于正则表达式中该位置的单个字符。以下正则表达式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5:

/Chapter [12345]/
    请注意,单词 Chapter 和后面的空格的位置相对于中括号内的字符是固定的。中括号表达式指定的只是匹配紧跟在单词 Chapter 和空格后面的单个字符位置的字符集。这是第九个字符位置。

    若要使用范围代替字符本身来表示匹配字符组,请使用连字符 (-) 将范围中的开始字符和结束字符分开。单个字符的字符值确定范围内的相对顺序。下面的正则表达式包含范围表达式,该范围表达式等效于上面显示的中括号中的列表。

/Chapter [1-5]/
    当以这种方式指定范围时,开始值和结束值两者都包括在范围内。注意,还有一点很重要,按 Unicode 排序顺序,开始值必须在结束值的前面。

    若要在中括号表达式中包括连字符,请采用下列方法之一:

用反斜扛将它转义:
[/-]
将连字符放在中括号列表的开始或结尾。下面的表达式匹配所有小写字母和连字符:
[-a-z]
[a-z-]
创建一个范围,在该范围中,开始字符值小于连字符,而结束字符值等于或大于连字符。下面的两个正则表达式都满足这一要求:
[!--]
[!-~]
    若要查找不在列表或范围内的所有字符,请将插入符号 (^) 放在列表的开头。如果插入字符出现在列表中的其他任何位置,则它匹配其本身。下面的正则表达式匹配编号大于 5 的章节标题:

/Chapter [^12345]/
    在上面的示例中,表达式在第九个位置匹配 1、2、3、4 或 5 之外的任何数字字符。这样,例如,Chapter 7 就是一个匹配项,Chapter 9 也是一个匹配项。

上面的表达式可以使用连字符 (-) 来表示:

/Chapter [^1-5]/
    中括号表达式的典型用途是指定任何大写或小写字母或任何数字的匹配。下面的表达式指定这样的匹配:

/[A-Za-z0-9]/
原创粉丝点击