正则表达式匹配不带引号的字符串并忽略带引号的字符串

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

我正在尝试编写 Splunk 查询,并且需要解析提供给 Windows 程序的命令行参数。具体来说,我试图获取正在安装的软件包的名称。以下是一些数据示例:

/i "package\name" test
/i "package\name" "test"
/i "package\ name" test
/i "package\ name" "test"
/i package\name test
/package package\name "test"

包名称前面始终带有“/i”或“/package”(它们可以是大写或小写)和一个空格(尽管有时没有空格)。包名称通常用引号引起来,但有时也不用引号引起来。如果用引号引起来,则可以包含空格。它通常后面跟着更多的命令行参数,有时用引号引起来,有时不带引号,但我并不真正关心这些。它们由字符串 test/"test" 表示。我基本上试图获取“i”(或包)和包名称后面的命令行参数之间的所有内容。

我首先尝试使用

\/([iI]|(?i)package)\s?(?<package>.*?)\s
将包名称提取到捕获组中。但问题在于第三和第四个测试字符串,因为引号内有空格。它们会导致它们后面的所有内容被切断,所以我最终只会得到“包”而不是“包名称”。

所以我想也许我可以使用一个正则表达式来提取引号内的所有内容,另一个正则表达式来提取不带引号的所有内容,然后将它们组合起来。

使用以下正则表达式,我可以获得“package 上述字符串的前 4 个中的“ame”或“package\ name”没有问题:

\/([iI]|(?i)package)\s?"(?<package1>.*?)"

为了获取最后 2 个,我尝试获取 i/package 之后不以引号开头的所有内容:

\/([iI]|(?i)package)\s?[^"](?<package2>.*?)\s

但是,使用 regex101.com,似乎与所有测试字符串的包名称匹配。它切断了最后两个字符中的第一个字符,所以我有“ackage ame”。我不确定为什么会发生。

如果可以用一个表达式提取我想要的内容,那将是首选解决方案。但是,能够从最后 2 个测试用例中提取包名称也是可行的。但是,如果这是解决方案,则捕获组之间不应存在重叠。 package1 应匹配测试字符串 1-4 中的包名称,包 2 应匹配 5-6。

regex pcre splunk
1个回答
0
投票

尝试以下捕获模式。比赛将在第 2 组进行。

(?i)\/(?:i|package) ?(")?(.+?)(?(1)(?<!\\)"|\s)
© www.soinside.com 2019 - 2024. All rights reserved.