从文档中删除标签的简单正则表达式

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 行的替换示例对其进行了测试,并且每次都匹配。如果这对你有用,请告诉我!

  1. 阅读 anchors 了解您的模式不匹配的原因 您在架构之后 and/or 之前的单行输入文本 元素.
  2. 阅读关于 . (点)here 了解为什么包含“.*”的模式无法用于多行输入。
  3. 阅读(非)贪婪匹配here 以更好地理解@Robert 的回答。
  4. 使用字符 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>