以下の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パターンを提案できますか?
この正規表現\[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("]");
}
文字列の形式が固定されていて、処理する[...]
グループが常に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)
を追加します)。