我试图为我的项目编写简单的命令解析器类。这就是我所拥有的:
Main.java
public static void main(String[] args) {
CmdParser p = new CmdParser(args);
String st = p.getSourceType();
}
CmdParser.java
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CmdParser {
private String[] args;
public CmdParser(String[] args) {
this.args = args;
}
public String getSourceType() throws ParseException {
ArrayList<String> sourceTypes = new ArrayList<String>();
Pattern p = Pattern.compile("--source-type=([^\\s]+)");
for (String s : args) {
Matcher m = p.matcher(s);
if (m.groupCount() == 1) {
sourceTypes.add(m.group(1)); //line 28
}
}
return sourceTypes.get(0);
}
}
使用java Main --source-type=test
运行此操作会导致以下输出:
Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:536)
at CmdParser.getSourceType(CmdParser.java:28)
at Main.main(Main.java:11)
我评论了第28行。怎么可能,即使groupCount是1,所以应该是一个正确的组索引,java在这种情况下抛出IllegalStateException?另外,为什么没有找到模式?
答案 0 :(得分:2)
您需要使用:
if (m.find() && m.groupCount() == 1) {
sourceTypes.add(m.group(1)); //line 28
}
即。在find
方法之前致电matches
或group()
。
答案 1 :(得分:2)
您必须在m.find()
之前致电m.group()
:
for (String s : args) {
Matcher m = p.matcher(s);
if (m.find()) {
sourceTypes.add(m.group(1)); //line 28
}
}