正则表达式运算符的优先级是怎样的?能否详细解释一下?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2529个文字,预计阅读时间需要11分钟。
正则表达式从左到右进行计算,遵循循环优先级顺序,这与算术表达式类似。相同优先级的运算从左到右进行,不同优先级的运算先高后低。以下是从最高到最低优先级说明各种正则表达式运算:
1. 捕获组:用于提取文本片段,例如 `(abc)`。
2.非捕获组:不保存匹配的文本,例如 `(?:abc)`。
3.选择分支:用于选择多个可能匹配中的一个,例如 `a|b`。
4.零宽断言:用于断言某个位置之前或之后是否存在某个模式,例如 `(?=abc)` 或 `(?!abc)`。
5.量词:用于指定匹配次数,例如 `*`(零次或多次)、`+`(一次或多次)、`?`(零次或一次)、`{n}`(恰好n次)、`{n,}`(至少n次)、`{n,m}`(n到m次)。
6.字符类:用于匹配字符集,例如 `[abc]`、`[^abc]`。
7.字符范围:用于匹配连续字符范围内的任意一个字符,例如 `[a-z]`。
8.点号:用于匹配除换行符以外的任意字符,例如 `.`。
9.特殊字符:包括转义字符、锚点等,如 `^`(开始位置)、`$`(结束位置)、`\d`(数字)、`\w`(字母数字或下划线)等。
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
字符具有高于替换运算符的优先级,使得"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 的章节编号仍只匹配开头两位数字。另一个缺点是 Chapter 0 也将匹配。只匹配两位数字的更好的表达式如下:
/Chapter [1-9][0-9]?/
或
/Chapter [1-9][0-9]{0,1}/
*、+ 和 ? 限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。但是,有时您只需要最小的匹配。
例如,您可能搜索 HTML 文档,以查找括在 H1 标记内的章节标题。该文本在您的文档中如下:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
如果您只需要匹配开始 H1 标记,下面的“非贪心”表达式只匹配 <H1>。
/<.*?>/
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。
本文共计2529个文字,预计阅读时间需要11分钟。
正则表达式从左到右进行计算,遵循循环优先级顺序,这与算术表达式类似。相同优先级的运算从左到右进行,不同优先级的运算先高后低。以下是从最高到最低优先级说明各种正则表达式运算:
1. 捕获组:用于提取文本片段,例如 `(abc)`。
2.非捕获组:不保存匹配的文本,例如 `(?:abc)`。
3.选择分支:用于选择多个可能匹配中的一个,例如 `a|b`。
4.零宽断言:用于断言某个位置之前或之后是否存在某个模式,例如 `(?=abc)` 或 `(?!abc)`。
5.量词:用于指定匹配次数,例如 `*`(零次或多次)、`+`(一次或多次)、`?`(零次或一次)、`{n}`(恰好n次)、`{n,}`(至少n次)、`{n,m}`(n到m次)。
6.字符类:用于匹配字符集,例如 `[abc]`、`[^abc]`。
7.字符范围:用于匹配连续字符范围内的任意一个字符,例如 `[a-z]`。
8.点号:用于匹配除换行符以外的任意字符,例如 `.`。
9.特殊字符:包括转义字符、锚点等,如 `^`(开始位置)、`$`(结束位置)、`\d`(数字)、`\w`(字母数字或下划线)等。
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
字符具有高于替换运算符的优先级,使得"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 的章节编号仍只匹配开头两位数字。另一个缺点是 Chapter 0 也将匹配。只匹配两位数字的更好的表达式如下:
/Chapter [1-9][0-9]?/
或
/Chapter [1-9][0-9]{0,1}/
*、+ 和 ? 限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。但是,有时您只需要最小的匹配。
例如,您可能搜索 HTML 文档,以查找括在 H1 标记内的章节标题。该文本在您的文档中如下:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
如果您只需要匹配开始 H1 标记,下面的“非贪心”表达式只匹配 <H1>。
/<.*?>/
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。

