0

プロパティ ファイルに次のエントリがあります。

some.key = \n
  [1:Some value] \n
  [14:Some other value] \n
  [834:Yet another value] \n

正規表現を使用して解析しようとしていますが、グループ化が正しくできないようです。各エントリのキー/値を出力しようとしています。例: Key="834"、Value="さらに別の値"

private static final String REGEX_PATTERN = "[(\\d+)\\:(\\w+(\\s)*)]+";

private void foo(String propValue){
    final Pattern p = Pattern.compile(REGEX_PATTERN);
    final Matcher m = p.matcher(propValue);
    while (m.find()) {
        final String key = m.group(0).trim();
        final String value = m.group(1).trim();
        System.out.println(String.format("Key[%s] Value[%s]", key, value));            
    }
}

私が得るエラーは次のとおりです。

Exception: java.lang.IndexOutOfBoundsException: No group 1

正規表現で正しくグループ化していると思いましたが、そうではないと思います。どんな助けでも大歓迎です!

ありがとう

更新: ブラケットのエスケープが機能しました。パターンを次のように変更しました。フィードバックをお寄せいただきありがとうございます。

 private static final String REGEX_PATTERN = "\\[(\\d+)\\:(\\w+(\\w|\\s)*)\\]+";
4

4 に答える 4

2

これを試して:

private static final String REGEX_PATTERN = "\\[(\\d+):([\\w\\s]+)\\]";

final Pattern p = Pattern.compile(REGEX_PATTERN);
final Matcher m = p.matcher(propValue);
while (m.find()) {
    final String key = m.group(1).trim();
    final String value = m.group(2).trim();
    System.out.println(String.format("Key[%s] Value[%s]", key, value));
}
  1. [とは]文字クラスの開始と終了を表すため、エスケープする必要があります
  2. group(0)は常に完全一致であるため、グループは1から始める必要があります
  3. 私が2番目のグループをどのように書いたかに注意してください[\\w\\s]+。これは、単語または空白文字の文字クラスを意味します
于 2012-05-17T13:31:13.683 に答える
2

[エスケープする必要があります (および])。

"\\[(\\d+)....\\]+"

[]文字クラスに使用されます: [0-9]==(0|1|2|...|9)

于 2012-05-17T13:20:28.410 に答える
1

それはあなたの正規表現で[]あり、特殊文字であり、文字どおりに解釈したい場合はエスケープする必要があります。

試す

"\\[(\\d+)\\:(\\w+(\\s)*)\\]"

注 - 「+」を削除しました。マッチャーはパターンに一致する部分文字列を探し続けるため、+は必要ありません。(GLOBAL スイッチを入力する必要があるかもしれません - 思い出せません)。

\nおそらく、それらのそれぞれを分割するか[、次に分割することによって、これは正規表現なしでより簡単になるかもしれないと感じずにはいられません:

于 2012-05-17T13:20:31.653 に答える
0

複数の行で構成される文字列を使用しているため、次のように指示する必要がありますPattern

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE);

あなたには直接関係ありませんが、以下も追加することをお勧めしますDOTALL

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE | Pattern.DOTALL);
于 2012-05-17T13:20:03.603 に答える