VBScript用正则表达式替换特定值并修改文本文件

VBScript用正则表达式替换特定值并修改文本文件,vbscript,Vbscript,我知道有很多类似的问题,但我找不到正确的答案。我需要替换xml文件中以%开头和结尾的所有短语(例如,%TEST%或%TEST-NEW%) 到目前为止,我已经进行了以下试用: 这是我的测试,它在控制台中工作,但只有一行字符串 zone = "<test>%TEST%</test>" MsgBox zone 'Setting the regex and cheking the matches set regex = New RegExp regex.IgnoreCase =

我知道有很多类似的问题,但我找不到正确的答案。我需要替换xml文件中以%开头和结尾的所有短语(例如,%TEST%%TEST-NEW%

到目前为止,我已经进行了以下试用: 这是我的测试,它在控制台中工作,但只有一行字符串

zone = "<test>%TEST%</test>"
MsgBox zone
'Setting the regex and cheking the matches
set regex = New RegExp
regex.IgnoreCase = True
regex.Global = True
regex.Pattern = "%.+%"
Set myMatches = regex.execute(zone)
For each myMatch in myMatches
Wscript.echo myMatch
result = Replace(zone,myMatch,"")
next
MsgBox result
…第一个回显正确返回文件的内容,然后循环中的第二个回显回显需要替换的所有匹配项,但最后一个回显返回与第一个回显相同的结果(未替换任何内容)

xml如下所示(仅举个例子):

%TEST%
%价值%
%测试%
另外,我需要遍历特定文件夹中的xml文件,并替换上面的短语。有人能帮忙吗

适合我的最终剧本(非常感谢):

选项显式
Dim路径、文档、节点、占位符、srcFolder、FSO、FLD、fil
Set placeholder=New RegExp
占位符.Pattern=“%[^%]+%”
占位符.Global=True
srcFolder=“C:\test”
设置FSO=CreateObject(“Scripting.FileSystemObject”)
Set FLD=FSO.GetFolder(srcFolder)
对于FLD.文件中的每个文件
如果LCase(FSO.GetExtensionName(fil.Name))=“xml”,则
path=“C:\test\”&fil.Name
' 1. 将XML解析为DOM
Set doc=LoadXmlDoc(路径)
' 2. 选择并修改DOM节点
对于doc.selectNodes中的每个节点(“//text()|//@*”)
node.nodeValue=替换位置持有者(node.nodeValue)
下一个
' 3. 将修改后的DOM保存回文件
doc.save路径
如果结束
下一个
' --------------------------------------------------------------------------
函数LoadXmlDoc(路径)
设置LoadXmlDoc=CreateObject(“MSXML2.DomDocument.6.0”)
LoadXmlDoc.async=False
LoadXmlDoc.load路径
如果LoadXmlDoc.parseError.errorCode为0,则
WScript.Echo“XML文件中出现错误。”
WScript.Echo LoadXmlDoc.parseError.reason
WScript.Quit 1
如果结束
端函数
' --------------------------------------------------------------------------
函数替换位置保持器(文本)
暗配
对于占位符中的每个匹配。执行(文本)
text=Replace(text,match,GetReplacement(match))
下一个
SubstitutePlaceholders=文本
端函数
' --------------------------------------------------------------------------
函数GetReplacement(占位符)
选择案例占位符
案例“%TEST%”:GetReplacement=“新值”
案例“%BLA%”:GetReplacement=“其他新值”
Case-Else:GetReplacement=placeholder
结束选择
端函数
' --------------------------------------------------------------------------

切勿在XML文件上使用正则表达式,句号

使用XML解析器。它将更简单,代码更易于阅读,而且最重要的是:它不会破坏XML

下面是如何以正确的方式修改XML文档

选项显式
Dim路径、文档、节点、占位符
Set placeholder=New RegExp
占位符.Pattern=“%[^%]+%”
占位符.Global=True
path=“C:\path\to\your.xml”
' 1. 将XML解析为DOM
Set doc=LoadXmlDoc(路径)
' 2. 选择并修改DOM节点
对于doc.selectNodes中的每个节点(“//text()|//@*”)
node.nodeValue=替换位置持有者(node.nodeValue)
下一个
' 3. 将修改后的DOM保存回文件
doc.save路径
' --------------------------------------------------------------------------
函数LoadXmlDoc(路径)
设置LoadXmlDoc=CreateObject(“MSXML2.DomDocument.6.0”)
LoadXmlDoc.async=False
LoadXmlDoc.load路径
如果LoadXmlDoc.parseError.errorCode为0,则
WScript.Echo“XML文件中出现错误。”
WScript.Echo LoadXmlDoc.parseError.reason
WScript.Quit 1
如果结束
端函数
' --------------------------------------------------------------------------
函数替换位置保持器(文本)
暗配
对于占位符中的每个匹配。执行(文本)
text=Replace(text,match,GetReplacement(match))
下一个
SubstitutePlaceholders=文本
端函数
' --------------------------------------------------------------------------
函数GetReplacement(占位符)
选择案例占位符
案例“%TEST%”:GetReplacement=“新值”
案例“%BLA%”:GetReplacement=“其他新值”
Case-Else:GetReplacement=placeholder
结束选择
端函数
' --------------------------------------------------------------------------
XPath表达式
//text()|//*
以所有文本节点和所有属性节点为目标。如有必要,请使用不同的XPath表达式。(这里我将不介绍XPath基础知识,有很多资源可以学习它。)


当然,这个解决方案使用正则表达式,但它在XML结构包含的文本值上使用正则表达式,而不是在XML结构本身上。这是一个关键的区别。

对于一个文件来说效果很好,但是让它循环遍历文件夹中所有xml文件的最佳方法是什么呢。从修改单个文件的部分生成一个函数,在For Each循环中运行该函数。FileSystemObject将帮助您执行文件系统操作。我让它在文件中循环(您可能会做得更难看,但它可以工作),现在我遇到了一个问题,即如果文件夹中有其他文件类型,脚本将崩溃。知道如何只处理.xml文件吗?在处理文件之前检查文件扩展名。在VBScript中有多种检查文件扩展名的方法,请选择一种适合您的方法。@changer,开始吧!-我刚看到你问题的编辑。我也会这么做的。
Dim objStream, strData, fields
Set objStream = CreateObject("ADODB.Stream")
objStream.CharSet = "utf-8"
objStream.Open
objStream.LoadFromFile("C:\test\test.xml")
strData = objStream.ReadText()
Wscript.echo strData

set regex = New RegExp
regex.IgnoreCase = True
regex.Global = True
regex.Pattern = "%.+%"
Set myMatches = regex.execute(strData)
For each myMatch in myMatches
Wscript.echo myMatch
result = Replace(strData,myMatch,"")
next
Wscript.echo result
<script>%TEST%</script>
<value>%VALUE%</value>
<test>%TEST%</test>
Option Explicit

Dim path, doc, node, placeholder,srcFolder,FSO,FLD,fil

Set placeholder = New RegExp
placeholder.Pattern = "%[^%]+%"
placeholder.Global = True


srcFolder = "C:\test"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FLD = FSO.GetFolder(srcFolder)

For each fil In FLD.Files

    if LCase(FSO.GetExtensionName(fil.Name)) = "xml" Then

            path = "C:\test\" & fil.Name

            ' 1. parse the XML into a DOM
            Set doc = LoadXmlDoc(path)

            ' 2. select and modify DOM nodes
            For Each node In doc.selectNodes("//text()|//@*")
                node.nodeValue = SubstitutePlaceholders(node.nodeValue)
            Next

            ' 3. save modified DOM back to file
            doc.save path
    End If

Next            
' --------------------------------------------------------------------------

Function LoadXmlDoc(path)
    Set LoadXmlDoc = CreateObject("MSXML2.DomDocument.6.0")

    LoadXmlDoc.async = False
    LoadXmlDoc.load path
    If LoadXmlDoc.parseError.errorCode <> 0 Then
        WScript.Echo "Error in XML file."
        WScript.Echo LoadXmlDoc.parseError.reason
        WScript.Quit 1
    End If
End Function
' --------------------------------------------------------------------------

Function SubstitutePlaceholders(text)
    Dim match

    For Each match In placeholder.Execute(text)
        text = Replace(text, match, GetReplacement(match))
    Next

    SubstitutePlaceholders = text
End Function
' --------------------------------------------------------------------------

Function GetReplacement(placeholder)
    Select Case placeholder
        Case "%TEST%": GetReplacement = "new value"
        Case "%BLA%": GetReplacement = "other new value"
        Case Else: GetReplacement = placeholder
    End Select
End Function
' --------------------------------------------------------------------------