正则表达式以匹配具有相同名称的xml标记

时间:2014-11-13 10:02:04

标签: regex vbscript

我有3个xml标签,在1个字符串中具有相同的标签名称:

<Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name>

我想使用正则表达式提取每个节点的内容。这是我到目前为止尝试过的正则表达式

(<Name>)(.*)(<\/Name>)

但它与预期不符。它匹配整个字符串 <Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name>

任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

RegExps默认匹配贪婪(最长的序列)。使用&#34;。*?&#34;指定非贪婪的匹配:

>> set r = New RegExp
>> r.Pattern = "<Name>(.*?)</Name>"
>> s = "<Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name>"
>> WScript.Echo r.Execute(s)(0).Submatches(0)
>>
Case1
>>

请考虑使用XML工具(XPath,...)来处理XML数据。

答案 1 :(得分:1)

不要使用RegEx来解析XML / HTML。 请改用XML Parser。

我鼓励使用XPath(http://de.wikipedia.org/wiki/XPath

更多信息为什么RegEx不是XML Parser可以在这里找到: RegEx match open tags except XHTML self-contained tags

答案 2 :(得分:1)

我试试这个正则表达式。

<name>((?:(?!</?name[ >]).)*)</name>

查看演示: http://regex101.com/r/kP8uF5/22

答案 3 :(得分:0)

您的正则表达式并不像您期望的那样有效,因为您正在使用贪婪的匹配(.*)而不是非贪婪的匹配(.*?)。

但是,你shouldn't be using regular expressions for parsing XML。使用实际的XML解析器从XML数据结构中提取数据。

data = "<root><Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name></root>"

Set xml = CreateObject("Msxml2.DOMDocument.6.0")
xml.async = False
xml.loadXML data

If xml.parseError Then
  WScript.Echo xml.parseError.reason
  WScript.Quit 1
End If

For Each n In xml.SelectNodes("//Name")
  WScript.Echo n.text
Next