我正在寻找解决方案来删除具有特定单词的两个符号之间的文本的某些部分,例如:
列出我的话:
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
答案 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|\/)>
匹配不包含示例名称的值。
虚线框显示innertext不得包含的组。
在文中,您说开放标记集可以是<name ... />
或<name .... </name>
,如果它们类似于<name> .... </name>
,那么此块(?:\s) can be changed to
(?:\} S |&GT;)`
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>
)
)