0

正規表現の一般的な使用法の 1 つは、一致を一致に基づくものに置き換えることです。

たとえば、チケット番号を含む commit-text は、 (一部の環境の例として <>ABC-1234: some text (ABC-1234)に置き換える必要があります。)<ABC-1234>: some text (<ABC-1234>)

これはJavaでは非常に簡単です

String message = "ABC-9913 - Bugfix: Some text. (ABC-9913)";
String finalMessage = message;
Matcher matcher = Pattern.compile("ABC-\\d+").matcher(message);
if (matcher.find()) {
  String ticket = matcher.group();
  finalMessage = finalMessage.replace(ticket, "<" + ticket + ">");
}
System.out.println(finalMessage);

になります<ABC-9913> - Bugfix: Some text. (<ABC-9913>)

しかし、入力文字列に異なる一致がある場合、これは異なります。if (matcher.find()) {に置き換えて、少し異なるコードを試しましたwhile (matcher.find()) {。結果は、二重置換 ( ) で台無しになり<<ABC-9913>>ます。

一致するすべての値をエレガントな方法で置き換えるにはどうすればよいですか?

4

2 に答える 2

1

問題は、replace() メソッドが文字列を何度も変換することです。

より良い方法は、一度に 1 つのマッチを置き換えることです。matcher クラスには、このための appendReplacement-method があります。

String message = "ABC-9913, ABC-9915 - Bugfix: Some text. (ABC-9913,ABC-9915)";
Matcher matcher = Pattern.compile("ABC-\\d+").matcher(message);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
  String ticket = matcher.group();
  matcher.appendReplacement(sb, "<" + ticket + ">");
}
matcher.appendTail(sb);
System.out.println(sb);
于 2013-07-05T11:14:25.440 に答える