前提・実現したいこと
Javaで文字列に含まれる「%n」を「{n-1}」に変換したいです。
具体的に言うと、
「10点一致しました(%1、%2、%3、%4、%5、%6、%7、%8、%9、%10)」
↓
「10点一致しました({0}、{1}、{2}、{3}、{4}、{5}、{6}、{7}、{8}、{9}」
という変換がしたいです。
正規表現を使って「%n」を抽出することは思いつくのですが、
そこからどのようにn-1して変換すればよいかわからず、困っています。
※「%n」は「%1」~「%99」まで可変です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
こんな感じでしょうか。
Java
1import java.util.regex.*; 2 3class Main { 4 public static void main(String[] args) { 5 String src = "10点一致しました(%1、%2、%3、%4、%5、%6、%7、%8、%9、%10)"; 6 7 String dst = Pattern.compile("%(\d+)") 8 .matcher(src) 9 .replaceAll( 10 m -> String.format( 11 "{%d}", Integer.valueOf(m.group(1)) - 1 12 ) 13 ) 14 ; 15 16 System.out.println(dst); 17 } 18}
実行結果 Wandbox
plain
110点一致しました({0}、{1}、{2}、{3}、{4}、{5}、{6}、{7}、{8}、{9})
投稿2018/09/12 07:50
編集2018/09/12 07:54総合スコア35660
0
あんまりスマートじゃないんですが、Java もっと勉強せねばという思いを込めてとりあえず作ってみたんで載せときますね。
LouiS0616 さんのがスマートでいいですね。
java
1import java.util.regex.Pattern; 2import java.util.regex.Matcher; 3 4class Main { 5 public static void main(String[ ] args) { 6 String original = "10点一致しました(%1、%2、%3、%4、%5、%6、%7、%8、%9、%10)"; 7 String replaced = original; 8 Matcher m = Pattern.compile("%\d+").matcher(original); 9 10 while (m.find()) { 11 String matched = m.group(); 12 int number = Integer.valueOf(matched.split("%")[1]) - 1; 13 replaced = replaced.replaceFirst(matched, "{" + number + "}"); 14 } 15 16 System.out.println(replaced); 17 } 18}
投稿2018/09/12 08:12
総合スコア1803
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
正規表現を使って「%n」を抽出することは思いつくのですが、
そこからどのようにn-1して変換すればよいかわからず、困っています。
「10点一致しました(%1、%2、%3、%4、%5、%6、%7、%8、%9、%10)」
「10点一致しました(・・・)」というのは元データを加工した後のイメージということですよね?
加工前の元データが不明なので、正規表現で「%n」は抽出し取得済みとしてそれ以降の加工部分を書いてみました。
投稿2018/09/12 07:52
編集2018/09/12 08:21総合スコア1009
0
replace
を使うのはどうでしょうか。
Java
1文字列.replace(抽出する文字列,置き換える文字列);
追記
ただのreplace
だと該当するものを全部置換してしまうので、
replaceFirst
を使用した方がいいですかね。
…って書いている間にもっと良さそうな回答がついてますね。
追記
他の回答者の方に比べれば全然スマートじゃないし汎用性もないけど低評価つけられるほど酷いのか…。
↓こんな使い方を想定。
Java
1String chk = "10点一致しました(%1、%2、%3、%4、%5、%6、%7、%8、%9、%10)"; 2String rplChk = ""; 3for(int i=0;i<99;i++){ 4 rplChk = chk.replaceFirst("%"+(i+1),"{"+i+"}"); 5 chk = rplChk; 6} 7System.out.print(rplChk);
投稿2018/09/12 07:38
編集2018/09/12 08:37総合スコア992
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/09/12 08:44 編集
2018/09/12 09:00 編集
2018/09/12 09:05
2018/09/12 10:21
2018/09/12 10:53
2018/09/12 12:46
0
質問内容を勘違いして回答してしまったので取消します。
投稿2018/09/12 07:36
編集2018/09/12 07:38総合スコア5572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/12 08:16
2018/09/12 08:25
2018/09/12 10:22
2018/09/12 15:35
2018/09/12 16:20