我绝对不熟悉正则表达式,所以最好先问一些非常愚蠢的事情。我有一个从命令行执行的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
这将是所需的格式。好吧至少足够接近。我正在尝试创建一个与此匹配的正则表达式,并将选择参数字段,如:
例如,我创建一个IP地址的正则表达式没有问题,但我不能创建一个匹配这整个东西。到目前为止,我最好的选择是:
\w+[ ]{1}\w+[ ]{1}[-]{1}(\w+[=]{1}\w+){+}
很多问题。例如\ w +将不匹配'。'但是他们肯定会在那里。或者换个例子: mode可以具有以下选项之一:
我甚至在第一个问题上有点开枪,更不用说第二个了。
感谢您的帮助! - 乔伊
答案 0 :(得分:2)
解决此问题的正确方法是使用命令行界面库,例如Commons CLI。使用这些库,您可以定义应用程序的参数,库将根据此验证输入(即您的String[] args
)。
大多数CLI库可以处理高级概念,例如可选参数,标志,多部分参数等。它们还可用于为用户打印有用的用法消息。查看一些examples here。
一旦你使用这样的库来收集参数,你就可以使用regexp(如果需要的话)分别验证每个部分。
答案 1 :(得分: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
}
答案 2 :(得分:0)