VB.NET删除找到的字符串,包含两个符号之间的所有文本

时间:2013-05-17 00:55:34

标签: regex vb.net xpath

我正在寻找解决方案来删除具有特定单词的两个符号之间的文本的某些部分,例如:

列出我的话:

Anny
Thomas
Andreas

要过滤的全文:

<name list>
<name id="bla bla bla"
anny is very good girl
</name>

<name id="jark"/>

<name id="Thomas"
specific style
</name>

<name id="andreas" 30/>

<name id="ehl"
very nice
</name>
</name list>

在此示例中,我希望删除包含我的文字的文字,但它们也位于<name</name><name/>符号之间,因此输出将是:

<name id="jark"asdasdasdasd/>

这是我来的代码:

Dim todelete() As String = File.ReadAllLines("C:\Temp\todelete.txt")
Dim doc As XDocument = XDocument.Load("C:\Temp\test.txt")
For Each badname As String in todelete
    Dim e As XElement = From element
    In doc.Elements("name list").Elements("name")
    Where element.Attribute("name").Value = badname
    Select element

e.Remove()
doc.Save()
Next

2 个答案:

答案 0 :(得分:1)

如果这是XML,则应使用DOM修改工具来执行此操作。 如果使用字符串操作,如果文件结构需要更复杂,则代码容易受到各种问题的影响。

在标准VB中,您可以在项目中添加对MSXML的引用。然后,您可以使用DOMDocument.Load(filename)。或者在.NET中,使用System.Xml.XmlDocument

您可以使用SelectNodes搜索节点(请参阅XPath syntax

.net类有一个RemoveChild方法,可以用来改变XML而不用担心破坏结构。只需遍历选定的节点并使用即可    ParentNode.RemoveChild(item)

答案 1 :(得分:0)

描述

(?:<name\b)(?:\s)(?![^<\/]*?(?:Anny|Thomas|Andreas))[^<\/]*?(?:<\/name|\/)>匹配不包含示例名称的值。

enter image description here

虚线框显示innertext不得包含的组。

在文中,您说开放标记集可以是<name ... /><name .... </name>,如果它们类似于<name> .... </name>,那么此块(?:\s) can be changed to(?:\} S |&GT;)`

vb.net中的示例

Imports System.Text.RegularExpressions
Module Module1
  Sub Main()
    Dim sourcestring as String = "replace with your source string"
    Dim re As Regex = New Regex("(?:<name\b)(?:\s)(?![^<\/]*?(?:Anny|Thomas|Andreas))[^<\/]*?(?:<\/name|\/)>",RegexOptions.IgnoreCase OR RegexOptions.Multiline OR RegexOptions.Singleline)
    Dim mc as MatchCollection = re.Matches(sourcestring)
    Dim mIdx as Integer = 0
    For each m as Match in mc
      For groupIdx As Integer = 0 To m.Groups.Count - 1
        Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
      Next
      mIdx=mIdx+1
    Next
  End Sub
End Module

$matches Array:
(
    [0] => Array
        (
            [0] => <name jark/>
            [1] => <name ehl
very nice
</name>
        )

)