当替换包含$&;时,为什么VBscript RegExp Replace意外失败;?
期望值基于以下文档: “正则表达式(RegExp)对象”当替换包含$&;时,为什么VBscript RegExp Replace意外失败;?,vbscript,Vbscript,期望值基于以下文档: “正则表达式(RegExp)对象” “正则表达式(脚本)简介” 在这里对比成功: DIM re2:Set re2 = New RegExp WITH re2 .Pattern = "dol amp" .IgnoreCase = True .Global = True MsgBox .Replace("put dol amp here","ok$&done") ' Expected: put ok$&done here ' Observed: put
“正则表达式(脚本)简介”
在这里对比成功:
DIM re2:Set re2 = New RegExp
WITH re2
.Pattern = "dol amp"
.IgnoreCase = True
.Global = True
MsgBox .Replace("put dol amp here","ok$&done")
' Expected: put ok$&done here
' Observed: put okdol ampdone here
END WITH
因为在Replace-replacement字符串中,$&是一个具有特殊意义的保留序列,尽管文档中没有提到这一点 解决方法:如果您乐于回答未记录的行为,您可以避开$&e.g
DIM re2:Set re2 = New RegExp
WITH re2
.Pattern = "dol amp"
.IgnoreCase = True
.Global = True
MsgBox .Replace("put dol amp here","ok$ &done")
' Expected: put ok$ &done here
' Observed: as expected
END WITH
观察到:
读者不喜欢依赖未定义的行为,请参见此处:未记录的行为与未定义的行为不同。虽然VBScript文档在某些方面(特别是在正则表达式的更精细细节方面)有所欠缺,但这种行为并不完全出乎意料。Microsoft有很长的历史,通过将字符加倍来转义具有特殊意义的字符(VBScript中最突出的例子是字符串文本中的双引号)。而
&
是许多正则表达式实现中“整个匹配”的常见元字符
如果你需要文档,你可以看一下。它的功能集基本上是VBScript引擎中实现的功能的超集
总结如下:
- 替换模式中的
是对整个匹配的引用$&
,$1
等都是用来捕获组的$2
- 要获取文本
,$&
,$1
等,在替换中,通过加倍来转义$2
$
$&
时),说明包含“美元变量”,在VBScript部分中说明“VBScript现在具有JScript正则表达式的所有功能”
DIM re2:Set re2 = New RegExp
WITH re2
.Pattern = "dol amp"
.IgnoreCase = True
.Global = True
MsgBox .Replace("put dol amp here",Replace("ok$&done","$","$$"))
' Expected: put ok$&done here
' Observed: as expected
END WITH