RegEx 在 VBScript 中的 xml 节点之间提取数据

问题描述 投票:0回答:2

首先,我已经阅读了所有符合上述标题的参考资料,但似乎没有一个能回答我的简单要求。我必须使用正则表达式模式,因为我需要将其提供给第三方库进行处理。

第 1 部分: 要读取的 xml 文件是一个简单的 project.exe.config 文件。我已经使用过的正则表达式是

 <system.serviceModel>[\s\S]*?<\/system.serviceModel>

这会读取节点及其内容,但是我只需要返回内容。

第二部分: 这应该很简单,我不好意思在这样一个受人尊敬的论坛上提问。你能推荐一个程序吗 a) 允许我测试主题文件上的各种正则表达式模式和 b) 被设计为同时为我设计正则表达式模式。我已经支付并安装了 RegExBuddy,但程序本身似乎让我感到困惑,更不用说正则表达式本身了。

编辑: VBscript 不支持回顾。 我需要使用 VBscript,因为我正在使用第三方工具。

regex vbscript
2个回答
0
投票

您可以使用环顾四周只捕获内容:

(?<=<system\.serviceModel>)[\s\S]*?(?=<\/system\.serviceModel>)

试试看


0
投票

这可以很简单地使用positive lookbehind

?<=
)和positive lookahead
?=

(?<=<system.serviceModel>)[\s\S]*?(?=<\/system.serviceModel>)

示例:regex101

Positive lookbehind 将寻找特定模式后面的匹配项,在这种情况下是

<system.serviceModel>
,反之亦然,positive lookahead 将向前看
<\/system.serviceModel>
pattern.

要测试和学习正则表达式,regex101.com 是一个支持多种语言的好地方,有一个友好的用户界面和解释,还有一个很好的调试器

Edit:OP 编辑了使用正则表达式与 VBScript 的要求,它不支持 lookbehind。所以后续是使用捕获组:

<system.serviceModel>([\s\S]*?)(?=<\/system.serviceModel>)

它也可以在没有前瞻的情况下工作

<system.serviceModel>([\s\S]*?)<\/system.serviceModel>

我不熟悉VBScript,但概念大概是这样的:

Set regexObj = CreateObject("vbscript.regexp")
regexObj.Pattern = "<system.serviceModel>([\s\S]*?)(?=<\/system.serviceModel>)"
' or <system.serviceModel>([\s\S]*?)<\/system.serviceModel>
Set matchesObj= regexObj.Execute("<system.serviceModel>Something in side the xml tag!</system.serviceModel>")
If matchesObj.Count <> 0 Then
    WScript.Echo(matchesObj(0).Submatches(0))
    ' or matchesObj.Item(0).SubMatches.Item(0) 
    ' to access first submatch group ([\s\S]*?)
End If
© www.soinside.com 2019 - 2024. All rights reserved.