質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

259閲覧

Javaの正規表現でパターンマッチしたものに番号をつけてreplaceするにはどうすればいいですか?

yamamotoyama

総合スコア25

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/03/24 09:20

実現したいこと

私は現在javaでテキストデータを変換するクラスを書いています。
そこでしたいことは、正規表現のMatcherクラスにおいて、パターンにマッチするものが見つかるごとに番号をつけてreplaceすることなのですが、やり方の見当もつかない状況です。
どなたかお知恵をお貸し下さい。

該当のソースコード

//変換前のテキスト String text = "apple banana belly banana apple belly"; //appleに適合した所に何番目のアップルかを示す数値を入れたい。 String regex = "apple"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(); int index = 0; while (m.find()){ //パターンマッチするごとに1ずつindexが増えていく。 index = index++; }

ここまでは考えたのですが、これを例えばindex + appleの形でappleと置換するにはどうしたらよいでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/03/24 09:50

すいません, 微妙に結果が分からないのですが, その例えで置換の結果 "apple banana belly banana apple belly" はどのような文字列になるのでしょうか.
yamamotoyama

2019/03/24 10:00

いや、これはまだ未完成のロジックなので答え求む!みたいな意味ですね。
guest

回答1

0

ベストアンサー

最善の方法では無いような気もしますが、思い付いた方法をば。

Java

1import java.util.function.Function; 2import java.util.regex.MatchResult; 3import java.util.regex.Pattern; 4 5 6class CountReplacer implements Function<MatchResult, String> { 7 private int cnt = 1; 8 9 @Override 10 public String apply(MatchResult m) { 11 return String.format( 12 "%s#%d", m.group(), cnt++ 13 ); 14 } 15} 16 17class Main { 18 public static void main(String[] args) { 19 var text = "apple banana belly banana apple belly"; 20 21 { 22 var dst = Pattern.compile("apple") 23 .matcher(text) 24 .replaceAll(new CountReplacer()) 25 ; 26 System.out.println(dst); 27 } 28 { 29 var dst = Pattern.compile("banana") 30 .matcher(text) 31 .replaceAll(new CountReplacer()) 32 ; 33 System.out.println(dst); 34 } 35 { 36 var dst = Pattern.compile("belly") 37 .matcher(text) 38 .replaceAll(new CountReplacer()) 39 ; 40 System.out.println(dst); 41 } 42 } 43}

実行結果 Wandbox

plain

1apple#1 banana belly banana apple#2 belly 2apple banana#1 belly banana#2 apple belly 3apple banana belly#1 banana apple belly#2

ラムダ式内から外部変数への再代入が効かないので、苦肉の策でクラスを組んでいます。

別解その1

関数型インターフェースを使わないで頑張ってみた方法。Wandbox

Java

1import java.util.regex.Pattern; 2 3 4class Main { 5 public static void main(String[] args) { 6 var text = "apple banana belly banana apple belly"; 7 8 String dst; 9 { 10 var dstBuilder = new StringBuilder(); 11 var matcher = Pattern.compile("apple").matcher(text); 12 13 var offset = 0; 14 for(var cnt = 0; matcher.find(offset); ++cnt) { 15 var start = matcher.start(); 16 var end = matcher.end(); 17 18 dstBuilder.append( 19 text.substring(offset, start) 20 ); 21 dstBuilder.append( 22 String.format("%s#%d", matcher.group(), cnt+1) 23 ); 24 offset = end; 25 } 26 dstBuilder.append( 27 text.substring(offset, text.length()) 28 ); 29 30 dst = dstBuilder.toString(); 31 } 32 33 System.out.println(dst); 34 } 35}

別解その2

正規表現を使わずに頑張ってみた方法。Wandbox
各単語がスペース区切りならこれで充分です。

Java

1import java.util.StringJoiner; 2 3 4class Main { 5 public static void main(String[] args) { 6 var text = "apple banana belly banana apple belly"; 7 8 String dst; 9 { 10 var joiner = new StringJoiner(" "); 11 12 var cnt = 0; 13 for(var word: text.split(" ")) { 14 if(word.equals("apple")) { 15 word = String.format("%s#%d", word, ++cnt); 16 } 17 18 joiner.add(word); 19 } 20 21 dst = joiner.toString(); 22 } 23 24 System.out.println(dst); 25 } 26}

投稿2019/03/24 09:50

編集2019/03/24 10:23
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamamotoyama

2019/03/24 10:56

回答ありがとうございます。 関数型インターフェイスを使う方法があったんですね。全く使ったことなかったので盲点でした。 もう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問