1

String パラメーターを受け取り、パラメーター名と値の 2 次元 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

与えられた例では、2 つの分割が機能するはずです。

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」オプションフォームの解析など)。これを行うために構築されたライブラリはたくさんあります。簡単に検索すると、ここに短いリストが表示されます。

本当に自分で書きたい場合は、各cmd-lineオプションを「=」で分割してみてください。不正な形式のコマンドがすべて表示されるので、エラーメッセージが大量に表示されます。

于 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 に答える