用于解析命令行选项的正则表达式

Regex to parse command line options

我需要将字符串解析为键值对,其中值可能是可选的。标准命令行解析器没有用,因为我检查的所有解析器都接受 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 参数解析库。即使这意味着编写代码来拆分您的自己串入参数,它可能不那么脆弱。)