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

sbdsn5lh  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(123)

我正在尝试编写一个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”而不是“package name”。
所以我想也许我可以用一个正则表达式来提取引号内的所有内容,另一个正则表达式来提取没有引号的所有内容,然后合并将它们组合起来。
使用下面的正则表达式,我可以从上面的前4个字符串中获得“package\name”或“package\ name”,没有问题:\/([iI]|(?i)package)\s?"(?<package1>.*?)"
为了得到最后2个,我试图得到i/package之后所有不以引号开头的东西:\/([iI]|(?i)package)\s?[^"](?<package2>.*?)\s
但是,使用regex101.com,它似乎匹配所有测试字符串的软件包名称。它切断了最后2个字符中的第一个字符,所以我有“ackage\name”。我不知道为什么会发生这两种情况。
如果可以用一个表达式提取我想要的内容,那将是首选的解决方案。但是,能够从最后2个测试用例中提取包名也可以。然而,如果这是解决方案,那么捕获组之间不应该重叠。package 1应该匹配测试字符串1-4中的包名,package 2应该匹配5-6。
最新消息:
感谢大家的回答。我从一位同事那里得到了一些帮助,我能够将其调整为我认为可行的解决方案。我想我会分享它,以防其他人发现它有帮助:(?i)(\/i)\s?(?:\"(?<package1>[^\"]*)\"|(?<package2>\S+))

h79rfbju

h79rfbju1#

我能够使用这个正则表达式解析示例数据。它使用条件匹配来决定package_name字段应该以引号还是空格结尾。

\/(?:i|package)\s*(\\\")?(?<package_name>(?(1)[^\"]+|\S+))(\1)?

字符串

kognpnkq

kognpnkq2#

尝试以下 * 捕获模式 。值将在 * 组2 中。

(?i)\/(?:i|package) ?(")?(.+?)(?(1)(?<!\\)"|\s)

字符串

xtupzzrd

xtupzzrd3#

regex101 example不区分大小写,并使用一种模式用于带引号的包名,而使用另一种模式用于不带引号的包名:

(?i)\/(?:i|package)(?:\s*"([^\\]+\\\s*.*?)"|\s+([^\\"]+\\.*?)\s)

字符串

相关问题