1

我绝对不熟悉正则表达式,所以最好先问然后做一些非常愚蠢的事情。我有一个要从命令行执行的 java 应用程序,它有一个非常好的签名。

java applicationName -mode=create -some.nice.arg=XXX.XXX.XXX.XXX:XXXX -another.nice.arg=value2 -third.nice.arg=value3 -again.nice.arg=value4 ... -nth.nice.arg=value_n+1

这将是所需的格式。至少足够接近。我正在尝试创建一个与此匹配的正则表达式,并会选择如下参数字段:

  • 模式=创建
  • some.nice.arg=XXX.XXX.XXX.XXX:XXXX
  • another.nice.arg=value2
  • 第三个.nice.arg=value3
  • 再次.nice.arg=value4
  • ...
  • nth.nice.arg=值_n+1

例如,我为 IP 地址创建一个正则表达式没有问题,但我无法创建一个匹配整个内容的正则表达式。到目前为止,我最好的选择是:

\w+[ ]{1}\w+[ ]{1}[-]{1}(\w+[=]{1}\w+){+}

很多问题。例如 \w+ 不会匹配 '.' 字符,但它们肯定会在那里。或者另一个例子:模式可以有以下选项之一:

  • 创造
  • 更新
  • 清除

即使是第一个问题,我也有点害怕,更不用说第二个了。

感谢您的每一个帮助!- 乔伊

4

3 回答 3

2

解决这个问题的正确方法是使用命令行界面库,例如Commons CLI。使用这些库,您可以为您的应用程序定义参数,并且该库将针对此验证输入(即您的String[] args)。

大多数 CLI 库可以处理高级概念,例如可选参数、标志、多部分参数等。它们还可用于为您的用户打印有用的使用消息。在这里查看一些示例

一旦您使用了这样的库来收集参数,您就可以使用正则表达式(如果需要)分别验证每个部分。

于 2013-05-16T11:07:38.633 回答
1

如果你真的想为此创建正则表达式,这里是提示:

mode=(\\w+)\\s+some.nice.arg=((?:\\w{3}\\.){3}\\w{3}:\\w{4})\\s+another.nice.arg=(\\S+?)\\s+third.nice.arg=(\\S+?)\\s+again.nice.arg=(\\S+?)

等等等等

然而更好的方法是将你的线分成几段,然后处理每一段:

String line = ....;
String[] segments = line.split("\\s+");

for (String segment : segments) {
    String[] parts = segment.split("=");
    String name = parts[0];
    String value = name[1];
    // deal with names and values
}
于 2013-05-16T11:11:40.580 回答
0

这可以满足您捕获参数的需要:

-([a-zA-Z.-]+)=((?:"[^"]+"|[^ ])+)

演示

于 2013-05-16T12:00:51.413 回答