使用Regex从字符串变量中删除标记

时间:2014-06-25 08:03:07

标签: regex vb.net string replace xml-parsing

应用程序包含string变量,其中包含xml个数据 我尝试使用<product_desc></product_desc>删除所有代码Regex 以下是string变量

的值
<orderlines>
    <orderline>
        <id>1000001</id>
        <product_id>2004</product_id>
        <product_desc>ITEM2004
        Color: red
        Size: 150x10x10
        Material: iron
        </product_desc>
        <qnt>2</qnt>
    </orderline>
    <orderline>
        <id>1000002</id>
        <product_id>2012</product_id>
        <product_desc>ITEM2012</product_desc>
        <qnt>4</qnt>
    </orderline>
    <orderline>
        <id>1000003</id>
        <product_id>3000</product_id>
        <product_desc>DELIVERY</product_desc>
        <qnt>1</qnt>
    </orderline>
</orderlines>

当我使用下一个模式时:

Dim pattern As String = "(<product_desc>[\s\S]*</product_desc>)"
Dim newvalue As String = Regex.Replace(originvalue, pattern, "")

我得到的结果如下:

<orderlines>
    <orderline>
        <id>1000001</id>
        <product_id>2004</product_id>

        <qnt>1</qnt>
    </orderline>
</orderlines>

问题是Regex匹配第一个<product_desc>和最后一个</product_desc>之间的所有值,并用空字符串替换它们。此方法会删除它们之间的所有<orederline>标记(检查<qnt>标记的值)。

任何人都可以提供一些关于限制删除的提示,仅删除特定标记。标签的内容可以包含所有可能的字符,换行符甚至HTML代码。

3 个答案:

答案 0 :(得分:2)

不是您的问题的答案,而是回应您的意见。您可以使用XmlConvert.IsXmlChar这样的方法从字符串中删除无效的xml字符,然后使用XmlDocument加载它:

Public Shared Function RemoveInvalidXmlChars(xml As String) As String
    Dim validXmlChars = xml.Where(Function(x) XmlConvert.IsXmlChar(x)).ToArray()
    Return New String(validXmlChars)
End Function

从这个答案转换而来,还有一些其他建议:How do you remove invalid hexadecimal characters from an XML-based data source prior to constructing an XmlReader or XPathDocument that uses the data?

答案 1 :(得分:1)

问题:[\s\S]*贪婪

它将每个字符匹配到字符串的末尾,然后引擎回溯以允许</product_desc>匹配。因此,从第一个开始标记到最后一个结束标记只有一个匹配。

解决方案(如果我们正在使用正则表达式):一个懒惰的量词

有关使用正则表达式解析xml的所有警告和免责声明......您可以这样做:

  • ?添加到量词会使其变为&#34;懒惰&#34;,以便它只根据需要匹配多个字符。
  • 您可以在DOTALL模式下使用.*?(如下面的示例代码所示)或[\s\S]*?(但没有任何意义)。

示例代码

Dim ResultString As String
Try
    ResultString = Regex.Replace(SubjectString, "(?s)<product_desc>.*?</product_desc>", "")
Catch ex As ArgumentException
    'Syntax error in the regular expression
End Try

<强>参考

答案 2 :(得分:0)

我会使用像Linq2Xml(XDocument和朋友)这样的XML API来做这种事情。为什么重新发明轮子?