Command line VBScript中的高级命令行替换命令

Command line VBScript中的高级命令行替换命令,command-line,replace,vbscript,Command Line,Replace,Vbscript,我正在为我的计算机语言编写一个编译器。现在,在编译语言之前,我实际上需要通过命令行vbs程序将所有撇号(')替换为百分比(%)。但是撇号只有在前面没有扬抑重音(^)时才需要替换。例如,在这段代码中: 颜色0a 输入12=0a“嗨!太好了!” 执行:testfornum'seven' 出口 :testfornum 如果是数字('1)( 返回 )否则( 打印0a“oops‘12’应该是数字” ) 返回 第2行的撇号不应替换,但第3、6和9行的撇号应替换 有人能帮我吗 这就是我到目前为止所做的: 's

我正在为我的计算机语言编写一个编译器。现在,在编译语言之前,我实际上需要通过命令行vbs程序将所有撇号(')替换为百分比(%)。但是撇号只有在前面没有扬抑重音(^)时才需要替换。例如,在这段代码中:

颜色0a

输入12=0a“嗨!太好了!”

执行:testfornum'seven'

出口

:testfornum

如果是数字('1)(

返回

)否则(

打印0a“oops‘12’应该是数字”

)

返回

第2行的撇号不应替换,但第3、6和9行的撇号应替换

有人能帮我吗

这就是我到目前为止所做的:

'syntax: (cscript) replace.vbs [filename] "StringToFind" "stringToReplace"

Option Explicit
Dim FileScriptingObject, file, strReplace, strReplacement, fileD, lastContainment,        newContainment

file=Wscript.arguments(0)
strReplace=WScript.arguments(1)
strReplacement=WScript.arguments(2)

Set FileScriptingObject=CreateObject("Scripting.FileSystemObject")
if FileScriptingObject.FileExists(file) = false then
    wscript.echo "File not found!"
    wscript.Quit
end if

set fileD=fileScriptingobject.OpenTextFile(file,1)
lastContainment=fileD.ReadAll

newContainment=replace(lastContainment,strReplace,strReplacement,1,-1,0)
set fileD=fileScriptingobject.OpenTextFile(file,2)
fileD.Write newContainment
fileD.Close

用普通的字符串替换无法做到这一点。不过,正则表达式可以工作:

...
Set re = New RegExp
re.Pattern = "(^|[^^])'"
re.Global  = True

newContainment = re.Replace(lastContainment, "$1%")
...

由于@Ansgar的解决方案在前导(之前没有非“^”)的特殊情况下失败,因此有一种方法可以在测试脚本中使用替换函数,从而简化进一步的实验:

Option Explicit

Function fpR(m, g1, g2, p, s)
  If "" = g1 Then
     fpR = "%"
  Else
     fpR = m
  End If
End Function

Function qq(s)
  qq = """" & s & """"
End Function

Dim rE : Set rE = New RegExp
rE.Global = True
rE.Pattern = "(\^)?(')"
Dim rA : Set rA = New RegExp
rA.Global = True
rA.Pattern = "([^^])'"
'rA.Pattern = "([^^])?'"

Dim s
For Each s In Split(" 'a^'b' a'b'^'c nix a^''b")
    WScript.Echo qq(s), "==>", qq(rE.Replace(s, GetRef("fpR"))), "==>", qq(rA.Replace(s, "$1%"))
Next
输出:

cscript 25221565.vbs
"" ==> "" ==> ""
"'a^'b'" ==> "%a^'b%" ==> "'a^'b%"     <=== oops
"a'b'^'c" ==> "a%b%^'c" ==> "a%b%^'c"
"nix" ==> "nix" ==> "nix"
"a^''b" ==> "a^'%b" ==> "a^'%b"
cscript 25221565.vbs
"" ==> "" ==> ""
“'a^'b'”==>%a^'b%“=>”'a^'b%“a%b%^'c”==>“a%b%^'c”
“尼克斯”==>“尼克斯”==>“尼克斯”
“a^”b==>“a^'%b==>”a^'%b”

这个特殊的边缘情况可以通过在正则表达式中添加“字符串开头”来处理:
(^ |[^^])”
(我相应地更新了我的答案)。替换功能对于这一点来说太麻烦了。然而,还有另一种边缘情况(顺序单引号),AFAICS确实需要替换函数。它可以通过捕获第二组中的单引号序列来处理:
函数fpR(m,g1,g2,p,s):fpR=g1&Replace(g2,“,”,“%”:End function