Java-Tokenize参数列表

Java-Tokenize参数列表,java,regex,list,listview,tokenize,Java,Regex,List,Listview,Tokenize,我试图创建一个方法,它接受一个字符串参数,然后返回一个包含参数名和值的二维字符串数组 protected final String[][] setParams (String parms) { String[][] params; int i = 0; Pattern p = Pattern.compile(NEED_REGEX_HERE); Matcher m = p.matcher(parms); params = String[m.groupCou

我试图创建一个方法,它接受一个字符串参数,然后返回一个包含参数名和值的二维字符串数组

protected final String[][] setParams (String parms) {
    String[][] params;
    int i = 0;
    Pattern p = Pattern.compile(NEED_REGEX_HERE);
    Matcher m = p.matcher(parms);

    params = String[m.groupCount()][2];

    while (m.find()) {
        params[i][0] = m.group(i).subString(0,m.group(i).indexOf('='));
        params[i][1] = m.group(i).subString(m.group(i).indexOf('='));
        i++;
    }

    return params;
}
一些输入示例如下(内引号):


所以“;”是列表delimeter,赋值运算符“=”表示有效参数,即“\”是一个丢弃值。基本上,我正在寻找一个正则表达式,它允许我这样做,或者如果有人能提供一个更优雅的解决方案。

这里面有足够的陷阱,你最好使用一个预先编写的库(例如解析“-h,--help,foo=bar”选项表单等)。有很多图书馆就是为此而建的。快速搜索发现了一个简短的列表


如果您真的想自己编写,我会尝试用“=”分隔每个cmd行选项,并为您将得到的所有格式错误的命令提供大量友好的错误消息。

对于给定的示例,两个分隔应该有效:

String[] keyValuePairs = line.split(";");
for (String keyValuePair:keyValuePairs) {
  if (isThrowAwayParameter(keyValuePair)) {
    handleThrowAwayParameter();
  } else {
    String[] keyAndValue = keyValuePair.split("=");
    String key = keyAndValue[0];
    String value = keyAndValue[1];
    handleKeyAndValue(key, value);
  }
}

如果您仍然对regex版本感到好奇(我知道您已经标记了答案)。。。事情会是这样的:

Pattern p = Pattern.compile( "(\\w+)=(\\w+);?" );
Matcher m = p.matcher( myString );
while( m.find() ) {
    System.out.println( "name[" + m.group(1) + "] = value[" + m.group(2) + "]" );
}

这假定名称和值仅由单词字符(字母数字)组成。在这种情况下,带有“可选”量词的分号实际上是不必要的,因为这将很高兴地跳过它不理解的内容。

如果参数名称是唯一的,则可以使用Properties类:

Properties p = new Properties();
p.load(new StringReader(parms.replaceAll(";", "\n")));

你真的对我的输入有多大的控制权假设得太多了。我从文件中提取这些行,并根据定义的参数有条件地输出到csv。你考虑过返回地图吗?我不知道为什么我总是试图把事情复杂化。谢谢这很有效。我切换到字符串数组列表来处理动态大小调整,但非常感谢。
Properties p = new Properties();
p.load(new StringReader(parms.replaceAll(";", "\n")));