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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1682閲覧

Javaの正規表現でマッチした箇所に処理をしたい

presente

総合スコア8

Java

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/02/25 09:05

正規表現でマッチした箇所に対して、何らかの処理をして元の文字列に戻す処理をしたいと思っています。例えば、入力文字のうち[0-9]の部分に対して、逆順に並び替えて元の文字列に戻す処理です。

text=123abc456def789
text=321abc654def987

Javaの正規表現のサンプルはたくさんありますが、入力文字列の中にマッチする箇所が複数あったり(上記の例では3箇所ある)、単に置換するのではなく、何らかの処理を加えて戻したりするようなやや複雑な例を見つけることができませんでした。いくつかアイディアを思いつきましたが、おそらくよりよい方法があると思います。アイディアの例。

  1. マッチする箇所を全部抜き出す
  2. replaceAll("[0-9]", "絶対に出てこないであろう特殊文字列"); に置換する
  3. 抜き出した箇所に処理を加えて、"絶対に出てこないであろう特殊文字列"を左から順にreplace()していく

その"絶対に出てこないであろう特殊文字列"はおそらく出てくることはないと思いますが、万一入力文にその文字列が含まれていた場合には誤動作しますし、必要以上に複雑なことをしているような気もします。

正規表現に詳しい方がいらっしゃいましたら、ご指導いただけると幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

text を delimiter(正規表現) で分割 (ただし delimiter も分轄結果に含める) し、
delimiter には reverse 処理を行うという方法で書いてみました。

java

1import java.util.ArrayList; 2import java.util.List; 3import java.util.regex.Matcher; 4import java.util.regex.Pattern; 5 6public class ReplaceRegEx { 7 8 static public void main(String[] args) { 9 String text = "123abc456def789"; 10 System.out.println(text); 11 System.out.println(replace(text)); 12 } 13 14 static String replace(String text) { 15 List<String> tokens = new ArrayList<String>(); 16 Pattern pattern = Pattern.compile("\d+"); 17 Matcher m = pattern.matcher(text); 18 int last_match = 0; 19 20 while (m.find()) { 21 tokens.add(text.substring(last_match, m.start())); 22 // delimiter は reverse させて追加する 23 tokens.add(new StringBuilder(m.group()).reverse().toString()); 24 last_match = m.end(); 25 } 26 tokens.add(text.substring(last_match)); 27 return String.join("", tokens); 28 }

実行例
イメージ説明

参考情報

  • How to split a string, but also keep the delimiters?

https://stackoverflow.com/questions/22063

  • Reverse a string in Java

https://stackoverflow.com/questions/7569335/

投稿2018/02/25 12:05

katoy

総合スコア22324

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

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

presente

2020/04/29 00:25

回答ありがとうございます。またお返事が非常に遅くなったことをお詫びいたします。お二方の回答を拝見してどちらをベストアンサーにするか悩みましたが、タイムスタンプで選ばせていただきました。繰り返しになりますが、コメントを忘れていたことをお詫びいたします。
guest

0

ベストアンサー

Matcher#appendReplacementを組み合わせるといいのではないでしょうか。
この例ならおそらく次のようになるかと思います。

java

1Matcher matcher = Pattern.compile("[0-9]+").matcher("123abc456def789"); 2StringBuffer buffer = new StringBuffer(); 3while(matcher.find()) { 4 String replace = new StringBuilder(matcher.group()).reverse().toString(); 5 matcher.appendReplacement(buffer, replace); 6} 7matcher.appendTail(buffer); 8String result = buffer.toString();

投稿2018/02/25 09:23

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/02/25 10:08

同じ文字がでたら失敗しそうなきがする 1. 123abc1234df234 2. 321abc3214df234 3. 321abc3214df234 4. 321abc3214df432 みたいに
swordone

2018/02/25 10:37

なぜ?同じ文字とか関係なく先頭から順番に置換作業するだけですが…
退会済みユーザー

退会済みユーザー

2018/02/25 10:48

ぱっとみの感覚で(汗 問題なさそうね
presente

2020/04/29 00:23

大変失礼しました。2年ほど前の質問に対して今になってコメントをします。回答してくださったお二人のものを見比べましたが、甲乙つけがたいと思いましたのでタイムスタンプが早い方をベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問