Expect正则表达式是否支持类似Perl的\g1反向引用?
关于Expect正则表达式反向引用的问题
问题背景
在自动化程序测试中,需要匹配输出中=两侧完全相同的16位随机字符串,示例如下:
kfvggfhuvgdnjhrk=kfvggfhuvgdnjhrk
最初为Expect编写的正则表达式为:
-re "\r\n\[cbdefghijklnrtuv\]{16}=\[cbdefghijklnrtuv\]{16}\r\n"
该表达式能匹配目标格式,但允许=两侧的字符串不同,无法满足“两侧必须完全一致”的需求。
在Perl 5.26.1调试器中测试发现,使用$1反向引用无法匹配重复模式,而\g1可以,测试示例如下:
main::(-e:1): 1 DB<1> x 'a=a' =~ /^(a)=$1$/ empty array DB<2> x 'a=a' =~ /^(a)=\g1$/ 0 'a' DB<3> x 'ab=ab' =~ /^(ab)=\g1$/ 0 'ab' DB<4> x 'ab=ab' =~ /^(ab)=\g1b$/ empty array DB<5> q
由此提出疑问:Expect正则表达式是否支持类似\g1的反向引用方式?
解答
Expect的正则表达式引擎基于Tcl的正则表达式库,从Tcl 8.5版本开始,Expect支持\gN格式的反向引用(N为捕获组的编号),同时也支持传统的\1、\2这类数字反向引用语法。
针对你的需求,可将正则修改为以下两种形式之一,确保=两侧的16位字符串完全一致:
- 使用
\g1反向引用:
-re "\r\n(\[cbdefghijklnrtuv\]{16})=\g1\r\n"
- 使用传统
\1反向引用:
-re "\r\n(\[cbdefghijklnrtuv\]{16})=\1\r\n"
上述两种写法均能严格匹配=两侧完全相同的目标字符串,解决原正则的缺陷。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

