gpt4 book ai didi

java - 正则表达式解析命令行选项

转载 作者:行者123 更新时间:2023-11-30 05:55:54 25 4
gpt4 key购买 nike

我需要将字符串解析为键值对,其中值可能是可选的。标准命令行解析器没有用,因为我检查的所有解析器都接受 String[] 而不是 String。因此,我求助于正则表达式,果然,面临以下问题:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

首先,输入字符串:

"/opt/sensu/embedded/bin/ruby /opt/sensu/embedded/bin/check-graphite-stats.rb " +
"--crit 25 --host 99.99.999.9999:8082 --period -5mins --target 'alias(scale(divideSeries(" +
"summarize(sumSeries(nonNegativeDerivative(transformNull(exclude(" +
"\\\"unknown\\\"), 0))), \\\"30d\\\", \\\"sum\\\", false),summarize(" +
...gigantuous string
\\\"sum\\\", false)), 100), \\\"3pp error rate\\\")' " +
"--unknown-ignore --warn 5"

接下来,我的正则表达式:

(--(?<option>.+?)\s+(?<value>.+?(?=--))?)+?

上面的几乎有效,但不完全有效。

输出:

--crit 25 
--host 99.99.999.9999:8082
--period -5mins
--target 'gigantuous string'
--unknown-ignore
--warn

为什么--warn的值没有被选取?

最佳答案

因为您正在正则表达式末尾处对下一个 -- 进行正向查找 ((?=--)),所以最后一个的值字符串中的参数未被拾取,因为它后面没有 --。接受字符串结尾作为替代方案 ((?:(?=--)|$)),然后过滤不以 -- 开头的值 (通过将 .+? 替换为 .(?:[^-].+?)?) 应该按照您想要的方式运行:

(--(?<option>.+?)\s+(?<value>.(?:[^-].+?)?(?:(?=--)|$))?)+?

(但是,正如其他人提到的,我会感到非常惊讶的是,没有一个适合您的用例的 Java 参数解析库。即使这意味着您自己编写代码将字符串拆分为参数,但它可能不那么脆弱。)

关于java - 正则表达式解析命令行选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com