快速入门
教程
工具和语言
示例
参考
书籍评论
正则表达式参考
简介
目录
快速参考
字符
基本功能
字符类
速记
锚点
单词边界
量词
Unicode
捕获组和反向引用
命名组和反向引用
特殊组
模式修饰符
递归和平衡组
替换参考
字符
匹配文本和反向引用
上下文和大小写转换
条件
本网站的其他内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书籍评论
可打印 PDF
关于本网站
RSS 提要和博客
RegexBuddy—Better than a regular expression reference!

正则表达式参考:平衡组、递归和子例程

功能语法说明示例JGsoft .NET Java Perl PCRE PCRE2 PHP Delphi R JavaScript VBScript XRegExp Python Ruby std::regex Boost Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE Oracle XML XPath
平衡组 (?<capture-subtract>regex) 其中“capture”和“subtract”是组名称,“regex”是任意正则表达式 “减去”必须用作 regex 中其他位置的捕获组的名称。如果此组已捕获尚未减去的匹配项,则平衡组将从“减去”中减去一个捕获项,尝试匹配“regex”,并将匹配项存储到组“捕获”中。如果省略“捕获”,则会发生相同的情况,但不会存储匹配项。如果省略“regex”,则平衡组将成功匹配,而无需遍历字符串。如果组“减去”没有要减去的匹配项,则平衡组将无法匹配,无论是否指定“regex”。 ^(?<l>\w)+\w?
(\k<l>(?<-l>))+
(?(l)(?!))$
匹配任何回文词
V2YESnononononononononononononononononononononono
平衡组 (?'capture-subtract'regex) 其中“capture”和“subtract”是组名称,“regex”是任何 regex “减去”必须用作 regex 中其他位置的捕获组的名称。如果此组已捕获尚未减去的匹配项,则平衡组将从“减去”中减去一个捕获项,尝试匹配“regex”,并将匹配项存储到组“捕获”中。如果省略“捕获”,则会发生相同的情况,但不会存储匹配项。如果省略“regex”,则平衡组将成功匹配,而无需遍历字符串。如果组“减去”没有要减去的匹配项,则平衡组将无法匹配,无论是否指定“regex”。 ^(?'l'\w)+\w?
(\k'l'(?'-l'))+
(?(l)(?!))$
匹配任何回文词
V2YESnononononononononononononononononononononono
递归 (?R) 整个正则表达式的递归。 a(?R)?z 匹配 azaazzaaazzz 等。 V2nono5.10YESYESYESYESYESnonononononoECMA
1.42–1.83
nononononononono
递归 (?0) 整个正则表达式的递归。 a(?0)?z 匹配 azaazzaaazzz 等。 V2nono5.10YESYESYESYESYESnonononononoECMA
1.42–1.83
nononononononono
递归 \g<0> 整个正则表达式的递归。 a\g<0>?z 匹配 azaazzaaazzz 等。 V2nonono7.7YES5.2.7YESYESnononono2.0nononononononononono
递归 \g'0' 整个正则表达式的递归。 a\g'0'?z 匹配 azaazzaaazzz 等。 V2nonono7.7YES5.2.7YESYESnononono2.0nononononononononono
子例程调用 (?1),其中 1 是捕获组的编号 捕获组的递归或子例程调用到捕获组。 a(b(?1)?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2no仅 45.10YESYESYESYESYESnonononononoECMA
1.42–1.83
nononononononono
子例程调用 \g<1>,其中 1 是捕获组的编号 捕获组的递归或子例程调用到捕获组。 a(b\g<1>?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
子例程调用 \g'1',其中 1 是捕获组的编号 捕获组的递归或子例程调用到捕获组。 a(b\g'1'?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
相对子例程调用 (?-1),其中 -1 是负整数 递归或子例程调用到捕获组,可以通过从右向左从子例程调用开始计算指定数量的命名或编号捕获组的左括号来找到该捕获组。 a(b(?-1)?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nono5.107.2YES5.2.4YESYESnonononononoECMA
1.42–1.83
nononononononono
相对子例程调用 \g<-1>,其中 -1 是负整数 递归或子例程调用到捕获组,可以通过从右向左从子例程调用开始计算指定数量的命名或编号捕获组的左括号来找到该捕获组。 a(b\g<-1>?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
相对子例程调用 \g'-1',其中 -1 是负整数 递归或子例程调用到捕获组,可以通过从右向左从子例程调用开始计算指定数量的命名或编号捕获组的左括号来找到该捕获组。 a(b\g'-1'?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
前向子例程调用 (?+1),其中 +1 是正整数 递归或子例程调用到捕获组,可以通过从左到右从子例程调用开始按指定数字计算命名或编号捕获组的左括号数量来找到。 (?+1)x([ab]) 匹配 axaaxbbxabxb V2nono5.107.2YES5.2.4YESYESnonononononoECMA
1.42–1.83
nononononononono
前向子例程调用 \g<+1>,其中 +1 是正整数 递归或子例程调用到捕获组,可以通过从左到右从子例程调用开始按指定数字计算命名或编号捕获组的左括号数量来找到。 \g<+1>x([ab]) 匹配 axaaxbbxabxb V2nonono7.7YES5.2.7YESYESnononono2.0nononononononononono
前向子例程调用 \g'+1',其中 +1 是正整数 递归或子例程调用到捕获组,可以通过从左到右从子例程调用开始按指定数字计算命名或编号捕获组的左括号数量来找到。 \g'+1'x([ab]) 匹配 axaaxbbxabxb V2nonono7.7YES5.2.7YESYESnononono2.0nononononononononono
命名子例程调用 (?&name),其中“name”是捕获组的名称 捕获组的递归或子例程调用到捕获组。 a(?<x>b(?&x)?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nono5.107.0YES5.2.2YESYESnonononononoECMA
1.42–1.83
nononononononono
命名子例程调用 (?P>name),其中“name”是捕获组的名称 捕获组的递归或子例程调用到捕获组。 a(?P<x>b(?P>x)?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nono5.10YESYESYESYESYESnonononononoECMA
1.42–1.83
nononononononono
命名子例程调用 \g<name>,其中“name”是捕获组的名称 捕获组的递归或子例程调用到捕获组。 a(?<x>b\g<x>?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
命名子例程调用 \g'name',其中“name”是捕获组的名称 捕获组的递归或子例程调用到捕获组。 a(?'x'b\g'x'?y)z 匹配 abyzabbyyzabbbyyyz 等。 V2nonono7.7YES5.2.7YESYESnononono1.9nononononononononono
子例程定义 (?(DEFINE)regex),其中“regex”是任意正则表达式 DEFINE 组不参与匹配过程。可以在 DEFINE 组内对捕获组进行子例程调用。 (?(DEFINE)([ab]))
x(?1)y(?1)z
匹配 xayazxaybzxbyazxbybz
V2nono5.107.0YES5.2.2YESYESnonononononoECMA
1.42–1.83
nononononononono
子例程调用捕获 使用 Ruby 风格 \g 语法的子例程调用 对捕获组的子例程调用会让该捕获组存储子例程调用期间匹配的文本。 ([ab])\g'1' 匹配 ab 时,匹配后第一个捕获组保存 b V2不适用不适用不适用nonononono不适用不适用不适用不适用1.9不适用不适用不适用不适用不适用不适用不适用不适用不适用不适用
子例程调用捕获 使用非 \g 语法的子例程调用 对捕获组的子例程调用会让该捕获组存储子例程调用期间匹配的文本。 ([ab])(?1) 匹配 ab 时,匹配后第一个捕获组保存 b no不适用nonononononono不适用不适用不适用不适用不适用不适用no不适用不适用不适用不适用不适用不适用不适用不适用
递归隔离捕获组 任何递归或子例程调用 每个子例程调用都有自己独立的捕获组存储空间。调用中的反向引用无法看到调用之前匹配的文本,调用之后的反向引用无法看到调用中匹配的文本。递归中的反向引用无法看到其他递归级别匹配的文本。 (a)(\1)(?2) 永远不会匹配任何内容,因为 \1 始终在 (?2) 进行的调用中失败。 no不适用no5.10–5.18nonononono不适用不适用不适用不适用no不适用no不适用不适用不适用不适用不适用不适用不适用不适用
递归恢复捕获组 使用 Ruby 风格 \g 语法的递归或子例程调用 当正则表达式引擎退出递归或子例程调用时,它会将所有捕获组恢复到进入递归或子例程调用之前匹配的文本。 (a)(([bc])\1)\g'2' 匹配 abaca 时,匹配后第三组存储 b no不适用不适用不适用7.7YES5.2.7YESYES不适用不适用不适用不适用no不适用不适用不适用不适用不适用不适用不适用不适用不适用不适用
递归恢复捕获组 使用除 \g 之外的语法进行递归或子例程调用 当正则表达式引擎退出递归或子例程调用时,它会将所有捕获组恢复到进入递归或子例程调用之前匹配的文本。 (a)(([bc])\1)(?2) 匹配 abaca 时,匹配后第三组存储 b V2不适用no5.10YESYESYESYESYES不适用不适用不适用不适用不适用不适用ECMA
1.42–1.83
不适用不适用不适用不适用不适用不适用不适用不适用
递归不会隔离或恢复捕获组 使用 Ruby 风格 \g 语法的递归或子例程调用 递归和子例程调用不会对捕获组进行任何特殊处理,除了子例程调用可能会捕获。反向引用始终查看每个捕获组最近匹配的文本,无论它们是否在同一级别的递归中。 (a)(([bc])\1)\g'2' 匹配 abaca 时,匹配后第三组存储 c V2不适用不适用不适用nonononono不适用不适用不适用不适用1.9不适用不适用不适用不适用不适用不适用不适用不适用不适用不适用
递归不会隔离或恢复捕获组 使用除 \g 之外的语法进行递归或子例程调用 递归和子例程调用不会对捕获组进行任何特殊处理,除了子例程调用可能会捕获。反向引用始终查看每个捕获组最近匹配的文本,无论它们是否在同一级别的递归中。 (a)(([bc])\1)(?2) 匹配 abaca 时,匹配后第三组存储 c no不适用仅 4nononononono不适用不适用不适用不适用不适用不适用no不适用不适用不适用不适用不适用不适用不适用不适用
递归是原子的 使用 (?P>…) 进行递归或子例程调用 递归和子例程调用是原子的。一旦正则表达式引擎退出它们,它不会回溯到其中尝试递归或子例程调用的不同排列。 (a+)(?P>1)(?P>1) 永远无法匹配任何内容,因为第一个 (?P>1) 匹配所有剩余的 a,当第二个失败时,正则表达式引擎不会回溯到第一个 (?P>1) V2不适用不适用no6.510.00–10.235.1.3–7.2.34YES2.14.0–3.6.3不适用不适用不适用不适用不适用不适用no不适用不适用不适用不适用不适用不适用不适用不适用
递归是原子的 使用除 (?P>0) 之外的语法对整个正则表达式进行递归 整个正则表达式的递归是原子的。一旦正则表达式引擎退出递归,它将不会回溯到其中尝试递归的不同排列。 aa$|a(?R)a|a 在递归为原子时匹配 aaa 中的 a;否则它将匹配整个字符串。 no不适用不适用no6.5YES5.1.3–7.2.34YESYES不适用不适用不适用不适用no不适用ECMA
1.42–1.83
不适用不适用不适用不适用不适用不适用不适用不适用
递归是原子的 使用 (?P>…) 以外的语法调用子例程 子例程调用是原子的。一旦正则表达式引擎退出它们,它将不会回溯到其中尝试子例程调用的不同排列。 (a+)(?1)(?1) 永远无法匹配任何内容,因为第一个 (?1) 匹配所有剩余的 a,而当第二个失败时,正则表达式引擎不会回溯到第一个 (?1) no不适用仅 4no6.510.00–10.235.1.3–7.2.34YES2.14.0–3.6.3不适用不适用不适用不适用no不适用no不适用不适用不适用不适用不适用不适用不适用不适用
功能语法说明示例JGsoft .NET Java Perl PCRE PCRE2 PHP Delphi R JavaScript VBScript XRegExp Python Ruby std::regex Boost Tcl ARE POSIX BRE POSIX ERE GNU BRE GNU ERE Oracle XML XPath