我有3个xml标签,在1个字符串中具有相同的标签名称:
<Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name>
我想使用正则表达式提取每个节点的内容。这是我到目前为止尝试过的正则表达式
(<Name>)(.*)(<\/Name>)
但它与预期不符。它匹配整个字符串
<Name>Case1</Name> <Name>Case2</Name><Name>Case3</Name>
任何帮助都会受到赞赏。
答案 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