正则表达式 运算符优先级介绍
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。
今天的表是对整体的正则表达式语法中的元字符的分类汇总。帮助记忆各元字符。同上一样,该文档转载至MSDN。
运算符
下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 说明 \ 转义符 (),(?:),(?=),[] 括号和中括号 *,+,?,{n},{n,},{n,m} 限定符 ^,$,\任何元字符、任何字符 定位点和序列 | 替换
字符具有高于替换运算符的优先级,使得“m|food”匹配“m”或“food”。若要匹配“mood”或“food”,请使用括号创建子表达式,从而产生“(m|f)ood”。
特殊字符表
特殊字符 注释 $ 匹配输入字符串结尾的位置。如果设置了RegExp对象的Multiline属性,那么$还匹配\n或\r前面的位置。若要匹配$字符本身,请使用\$。 () 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。若要匹配这两个字符,请使用\(和\)。 * 零次或多次匹配前面的字符或子表达式。若要匹配*字符,请使用\*。 + 一次或多次匹配前面的字符或子表达式。若要匹配+字符,请使用\+。 . 匹配除换行符\n之外的任何单个字符。若要匹配.,请使用\。 [] 标记中括号表达式的开始。若要匹配这些字符,请使用\[和\]。 ? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。若要匹配?字符,请使用\?。 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,字符n匹配字符n。\n匹配换行符。序列\\匹配\,序列\(匹配(。 / 表示文本正则表达式的开始或结束。若要匹配/字符,请使用\/。 ^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。若要匹配^字符本身,请使用\^。 {} 标记限定符表达式的开始。若要匹配这些字符,请使用\{和\}。 | 指出在两个项之间进行选择。要匹配|,请使用\|。
限定符含义
字符 说明 * 零次或多次匹配前面的字符或子表达式。例如,zo*匹配z和zoo。*等效于{0,}。 + 一次或多次匹配前面的字符或子表达式。例如,zo+匹配zo和zoo,但不匹配z。+等效于{1,}。 ? 零次或一次匹配前面的字符或子表达式。例如,do(es)?匹配do或does中的do。?等效于{0,1}。 {n} n是非负整数。正好匹配n次。例如,o{2}不匹配Bob中的o,但匹配food中的两个o。 {n,} n是非负整数。至少匹配n次。例如,o{2,}不匹配Bob中的o,而匹配foooood中的所有o。o{1,}等效于o+。o{0,}等效于o*。 {n,m} m和n是非负整数,其中n<=m。匹配至少n次,至多m次。例如,o{1,3}匹配fooooood中的头三个o。o{0,1}等效于o?。注意:您不能将空格插入逗号和数字之间。
由于章节编号在大的输入文档中会很可能超过九,所以您需要一种方式来处理两位或三位章节编号。限定符给您这种能力。下面的正则表达式匹配编号为任何位数的章节标题:
/Chapter[1-9][0-9]*/
请注意,限定符出现在范围表达式之后。因此,它应用于整个范围表达式,在本例中,只指定从0到9的数字(包括0和9)。
这里不使用+限定符,因为在第二个位置或后面的位置不一定需要有一个数字。也不使用?字符,因为它将章节编号限制到只有两位数。您需要至少匹配Chapter和空格字符后面的一个数字。
如果您知道章节编号被限制为只有99章,可以使用下面的表达式来至少指定一位但至多两位数字。
/Chapter[0-9]{1,2}/
上面的表达式的缺点是,大于99的章节编号仍只匹配开头两位数字。另一个缺点是Chapter0也将匹配。只匹配两位数字的更好的表达式如下:
/Chapter[1-9][0-9]?/
或
/Chapter[1-9][0-9]{0,1}/
*、+和?限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。但是,有时您只需要最小的匹配。
例如,您可能搜索HTML文档,以查找括在H1标记内的章节标题。该文本在您的文档中如下:
<H1>Chapter1–IntroductiontoRegularExpressions</H1>
下面的表达式匹配从开始小于符号(<)到关闭H1标记的大于符号(>)之间的所有内容。
/<.*>/
如果您只需要匹配开始H1标记,下面的“非贪心”表达式只匹配<H1>。
/<.*?>/
通过在*、+或?限定符之后放置?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。