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