0

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

用我的话列出:

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>

在此示例中,我想删除包含我的单词的文本,但它们也在<nameand</name><nameand/>符号之间,因此输出将是:

<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
4

2 回答 2

1

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

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

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

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

于 2013-05-17T01:56:58.897 回答
0

描述

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

在此处输入图像描述

虚线框表示内部文本不得包含的组。

在你说的文本中,开放标签集要么是,要么是<name ... />因为<name .... </name>它们类似于<name> .... </name>这个块(?:\s) can be changed to(?:\s|>)`

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>
        )

)
于 2013-05-17T01:59:48.113 回答