从文档中删除标签的简单正则表达式
Simple regex to remove a tag from a document
在使用非常简单的正则表达式从文档中删除标签时遇到一些问题,你能帮我弄清楚为什么它不起作用吗?基本上,我要匹配的是整个字符串中以“”开头并以 结尾的文本的任何部分。标签之间会有很多东西要去掉。使用 ^ 和 $ 我应该能够获取字符串并替换它。
这是有效的,但前提是我在字符串的开头或结尾没有任何其他字符。这是我的代码,第一个案例有效:
Dim strPayload
Dim fso, f1
Set fso=CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("C:\Prsxfer\Upload\Regex\upload" & year(now()) & right("0" & month(now()), 2) & right("0" & day(now()), 2) & ".xml")
Dim objRegEx
strPayload = "<Schema blah blah> </Schema>"
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "^<Schema.*</Schema>$"
strPayload = objRegEx.Replace(strPayload, "replaced")
f1.writeline strPayload
f1.close
set f1 = Nothing
set headerFile = Nothing
set fso = Nothing
输出:"replaced"正确。
但是,如果我在要查找的内容之前或之后有任何内容,则它不再进行替换。所以用以下任何一个替换第 6 行:
strPayload = "a<Schema blah blah> </Schema>"
或
strPayload = "<Schema blah blah> </Schema>a"
或
strPayload = "a<Schema blah blah> </Schema>a"
不匹配,我会取回我发送的原始字符串。
我需要如何修改正则表达式以使用前导和尾随信息?
顺便说一句,我正在使用 vbscript。
*编辑,完整的输入实际上看起来更像这样。虽然下面的解决方案在一行中有效,但如果标签跨多行,它似乎不起作用。
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="C" content="empty" model="closed">
<AttributeType name="Tag" dt:type="i4"/>
...
</ElementType>
</Schema>
</GRS_MESSAGES>
下面的方法可以工作,但前提是模式不能嵌套在自身中。
objRegEx.Pattern = "<Schema.*?</Schema>"
因此它将在 <schema>stuff<schema>stuff</schema>stuff</schema>
上失败,因为它将变为 replacedstuff</schema>
。
我会在这里尝试一下。应该给你一个全局标签匹配,标签中间的文本作为捕获组。如果您不是在寻找捕获组,请删除中间 .*
周围的括号(如下所示)。
objRegEx.Pattern = "<.*>?(.*)</.*>"
或
objRegEx.Pattern = "<.*>?.*</.*>"
我根据您提供的第 6 行的替换示例对其进行了测试,并且每次都匹配。如果这对你有用,请告诉我!
- 阅读 anchors 了解您的模式不匹配的原因
您在架构之后 and/or 之前的单行输入文本
元素.
- 阅读关于 . (点)here 了解为什么包含“.*”的模式无法用于多行输入。
- 阅读(非)贪婪匹配here 以更好地理解@Robert 的回答。
- 使用字符 class [\s\S](空格或非空格 = 一切)跨行匹配。
在代码中:
Option Explicit
Const csFSpec = "..\data976432.xml"
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim sAll : sAll = goFS.OpenTextFile(csFSpec).ReadAll()
WScript.Echo sAll
WScript.Echo "----------------"
Dim re : Set re = New RegExp
re.Pattern = "<Schema[\S\s]*</Schema>"
WScript.Echo re.Replace(sAll, "|replaced|")
输出:
cscript 29976432.vbs
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="C" content="empty" model="closed">
<AttributeType name="Tag" dt:type="i4"/>
<WhatEver/>
</ElementType>
</Schema>
</GRS_MESSAGES>
----------------
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
|replaced|
</GRS_MESSAGES>
在使用非常简单的正则表达式从文档中删除标签时遇到一些问题,你能帮我弄清楚为什么它不起作用吗?基本上,我要匹配的是整个字符串中以“
这是有效的,但前提是我在字符串的开头或结尾没有任何其他字符。这是我的代码,第一个案例有效:
Dim strPayload
Dim fso, f1
Set fso=CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("C:\Prsxfer\Upload\Regex\upload" & year(now()) & right("0" & month(now()), 2) & right("0" & day(now()), 2) & ".xml")
Dim objRegEx
strPayload = "<Schema blah blah> </Schema>"
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "^<Schema.*</Schema>$"
strPayload = objRegEx.Replace(strPayload, "replaced")
f1.writeline strPayload
f1.close
set f1 = Nothing
set headerFile = Nothing
set fso = Nothing
输出:"replaced"正确。
但是,如果我在要查找的内容之前或之后有任何内容,则它不再进行替换。所以用以下任何一个替换第 6 行:
strPayload = "a<Schema blah blah> </Schema>"
或
strPayload = "<Schema blah blah> </Schema>a"
或
strPayload = "a<Schema blah blah> </Schema>a"
不匹配,我会取回我发送的原始字符串。
我需要如何修改正则表达式以使用前导和尾随信息?
顺便说一句,我正在使用 vbscript。
*编辑,完整的输入实际上看起来更像这样。虽然下面的解决方案在一行中有效,但如果标签跨多行,它似乎不起作用。
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="C" content="empty" model="closed">
<AttributeType name="Tag" dt:type="i4"/>
...
</ElementType>
</Schema>
</GRS_MESSAGES>
下面的方法可以工作,但前提是模式不能嵌套在自身中。
objRegEx.Pattern = "<Schema.*?</Schema>"
因此它将在 <schema>stuff<schema>stuff</schema>stuff</schema>
上失败,因为它将变为 replacedstuff</schema>
。
我会在这里尝试一下。应该给你一个全局标签匹配,标签中间的文本作为捕获组。如果您不是在寻找捕获组,请删除中间 .*
周围的括号(如下所示)。
objRegEx.Pattern = "<.*>?(.*)</.*>"
或
objRegEx.Pattern = "<.*>?.*</.*>"
我根据您提供的第 6 行的替换示例对其进行了测试,并且每次都匹配。如果这对你有用,请告诉我!
- 阅读 anchors 了解您的模式不匹配的原因 您在架构之后 and/or 之前的单行输入文本 元素.
- 阅读关于 . (点)here 了解为什么包含“.*”的模式无法用于多行输入。
- 阅读(非)贪婪匹配here 以更好地理解@Robert 的回答。
- 使用字符 class [\s\S](空格或非空格 = 一切)跨行匹配。
在代码中:
Option Explicit
Const csFSpec = "..\data976432.xml"
Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim sAll : sAll = goFS.OpenTextFile(csFSpec).ReadAll()
WScript.Echo sAll
WScript.Echo "----------------"
Dim re : Set re = New RegExp
re.Pattern = "<Schema[\S\s]*</Schema>"
WScript.Echo re.Replace(sAll, "|replaced|")
输出:
cscript 29976432.vbs
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="C" content="empty" model="closed">
<AttributeType name="Tag" dt:type="i4"/>
<WhatEver/>
</ElementType>
</Schema>
</GRS_MESSAGES>
----------------
<?xml version="1.0" encoding="UTF-8"?>
<GRS_MESSAGES>
<RESPONSE_FORMAT_CODE>XML</RESPONSE_FORMAT_CODE>
<RESPONSE_CONTENT_CODE>FAIL</RESPONSE_CONTENT_CODE>
|replaced|
</GRS_MESSAGES>