1

我正在尝试创建一个方法,该方法采用 String 参数,然后返回参数名称和值的二维 String 数组。

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;
}

输入的一些示例是(在引号内):

"Name=Ryan;\;Name=John"
"Name=Ryan;Name=John"
"Name=Ryan"
"Name=Ryan;Index=1"

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

4

4 回答 4

2

如果您仍然对正则表达式版本感到好奇(我知道您已经标记了答案)......它会是这样的:

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) + "]" );
}

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

于 2010-01-25T18:40:39.143 回答
1

两个拆分应该适用于给定的示例:

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);
  }
}
于 2010-01-25T17:40:48.487 回答
0

这有足够的陷阱,你最好使用预先编写的库(例如解析“-h、--help、foo=bar”选项表单等)。有很多图书馆可以做到这一点。快速搜索在这里找到了一个简短的列表。

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

于 2010-01-25T17:14:59.917 回答
0

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

Properties p = new Properties();
p.load(new StringReader(parms.replaceAll(";", "\n")));
于 2010-01-25T22:05:45.430 回答