web-dev-qa-db-ja.com

Java正規表現パターンを使用して文字列を解析しますか?

以下のJava以下の形式の文字列があります。

String s = "City: [name:NYK][distance:1100] [name:CLT][distance:2300] [name:KTY][distance:3540] Price:"

Java.util.regexパッケージの案件とパターンクラスを使用して、次の形式で出力文字列を取得する必要があります。

Output: [NYK:1100][CLT:2300][KTY:3540]

上記の出力形式を取得するのに役立つRegExパターンを提案できますか?

6
Bharath Reddy

この正規表現\[name:([A-Z]+)\]\[distance:(\d+)\]は、次のようなパターンで使用できます。

String regex = "\\[name:([A-Z]+)\\]\\[distance:(\\d+)\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);

StringBuilder result = new StringBuilder();
while (matcher.find()) {                                                
    result.append("[");
    result.append(matcher.group(1));
    result.append(":");
    result.append(matcher.group(2));
    result.append("]");
}

System.out.println(result.toString());

出力

[NYK:1100][CLT:2300][KTY:3540]
  • 正規表現のデモ
  • \[name:([A-Z]+)\]\[distance:(\d+)\]は、\[name:([A-Z]+)\]の後に大文字が1つ、2番目のグループが\[distance:(\d+)\]の後に番号を取得することを意味します。

@ tradeJmark からの別の解決策:この正規表現を使用できます:

String regex = "\\[name:(?<name>[A-Z]+)\\]\\[distance:(?<distance>\\d+)\\]";

したがって、次のように、インデックスの代わりにグループの名前で各グループの結果を簡単に取得できます。

while (matcher.find()) {                                                
    result.append("[");
    result.append(matcher.group("name"));
    //----------------------------^^
    result.append(":");
    result.append(matcher.group("distance"));
    //------------------------------^^
    result.append("]");
}
10
YCF_L

文字列の形式が固定されていて、処理する[...]グループが常に3つしかない場合、次のようなブロックを定義できます。 [name:...]に一致し、2つの部分を別々のグループにキャプチャし、.replaceAllで非常に単純なコードを使用します。

String s = "City: [name:NYK][distance:1100] [name:CLT][distance:2300] [name:KTY][distance:3540] Price:";
String matchingBlock = "\\s*\\[name:([A-Z]+)]\\[distance:(\\d+)]";
String res = s.replaceAll(String.format(".*%1$s%1$s%1$s.*", matchingBlock), 
    "[$1:$2][$3:$4][$5:$6]");
System.out.println(res); // [NYK:1100][CLT:2300][KTY:3540]

Javaデモ およびa regexデモ を参照してください。

ブロックパターンは一致します。

  • \\s*-0個以上の空白
  • \\[name:-リテラル[name:サブストリング
  • ([A-Z]+)-グループnで1つ以上の大文字をキャプチャASCII chars(\\w+も使用できます)
  • ]\\[distance:-リテラル][distance:サブストリング
  • (\\d+)-グループmが1桁以上をキャプチャ
  • ]-]記号。

.*%1$s%1$s%1$s.*パターンでは、グループに1〜6個のID(置換パターンの$1-$6後方参照で参照)があり、先頭と最後の.*は削除されます文字列の開始と終了(文字列に改行を含めることができる場合は、パターンの先頭に(?s)を追加します)。

3