当替换包含$&;时,为什么VBscript RegExp Replace意外失败;?

当替换包含$&;时,为什么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

期望值基于以下文档:

“正则表达式(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 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
    等,在替换中,通过加倍来转义
    $

“未记录的行为与未定义的行为不同。”这种行为未记录的事实确实使其未定义在计算机编程中,未定义行为(UB)是在程序的当前状态(如内存)下执行计算机代码的结果,而该代码的行为不受该代码所遵循的语言规范的规定“微软通过将字符加倍来转义具有特殊意义的字符已有很长的历史。。。。和&是..“小心猜测。在这种情况下,加倍&失败。此行为未记录的事实使其未定义。不。您只是不理解MSDN中的VBScript文档不是(据我所知,尚未发布)。”您只是不理解MSDN中的VBScript文档不是语言规范“。如果您有任何证据表明存在定义此行为的语言规范,让我们看看它。在那之前,这种行为还没有定义。您对语言规范所做/将要说的不是定义的猜测,搜索把我带到了这里。我快一年了,但是,它不是没有记录的,它是糟糕的记录。在JScript部分中(当包含
$&
时),说明包含“美元变量”,在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