You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位字符串完全一致:

  1. 使用\g1反向引用:
-re "\r\n(\[cbdefghijklnrtuv\]{16})=\g1\r\n"
  1. 使用传统\1反向引用:
-re "\r\n(\[cbdefghijklnrtuv\]{16})=\1\r\n"

上述两种写法均能严格匹配=两侧完全相同的目标字符串,解决原正则的缺陷。


内容的提问来源于stack exchange,提问作者U. Windl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:18:09