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

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

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

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

正規表現

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

Q&A

解決済

2回答

1160閲覧

[正規表現][Java]文字列の置換(変換)について

niboshi39

総合スコア6

Java

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

正規表現

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

0グッド

0クリップ

投稿2021/08/17 14:19

編集2021/08/17 15:07

前提・実現したいこと

JAVAで文字列の変換を行おうとしています。
以下のような変換を実装中です。

変換前:gold in (0,1,2,10,11)) ) >= 1 )
変換後:gold in (0.0,1.0,2.0,10.0,11.0)) ) >= 1 )

※整数型を小数型に変えるのが目的です。

考えている処理としては、
(1)文字列をカンマ区切りで配列化
(2)配列毎に最初にでてきた数字に".0"を加えて置換

該当のソースコード

JAVA

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 // Your code here! 6 String COMMA = ","; 7 String strReplaceBefore = "gold in (0,1,2,10,11)) ) >= 1 )"; 8 String strWork = strReplaceBefore; 9 // ,区切りで配列化 10 String[] intStrList = strReplaceBefore.split(COMMA); 11 for (int x = 0; x < intStrList.length; x++) { 12 // String intStr = intStrList[x].replaceAll("[^0-9]", ""); 13 String intStr = intStrList[x].replaceFirst("[^0-9].*", ""); 14 if (!intStr.isEmpty()) { 15 strWork = strWork.replaceFirst(intStr, intStr + ".0"); 16 System.out.println(strWork); 17 } 18 } 19 } 20} 21

実行結果

gold in (0,1.0,2,10,11)) ) >= 1 )
gold in (0,1.0,2.0,10,11)) ) >= 1 )
gold in (0,1.0,2.0,10.0,11)) ) >= 1 )
gold in (0,1.0,2.0,10.0,11.0)) ) >= 1 )

最初の、 0 が 0.0 になってくれません。
どなたか原因わかりませんか。

補足情報(FW/ツールのバージョンなど)

paiza.io にコード貼っていただければそのまま動きます。

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

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

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

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

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

m.ts10806

2021/08/17 14:41

>初心者 「初心者アイコン」をつけるのにとどめてください。 要件とは別の話なので、タイトルや本文には不要です。
m.ts10806

2021/08/17 14:41

質問タグで表現できることもタイトルになくて良いです。
niboshi39

2021/08/17 15:14

有難うございます。タイトルを修正しました。
kazuma-s

2021/08/17 16:17

"gold in (0,1,2,1,2)) ) >= 1 )" は、 "gold in (0.0,1.0,2.0,1.0,2.0)) ) >= 1 )" になってほしいんですか? replaceFirst ではダメなんじゃないでしょうか?
guest

回答2

0

ベストアンサー

正規表現を使わないとダメなんですか?

java

1class Main { 2 public static void main(String[] args) throws Exception { 3 String s = "gold in (0,1,2,10,11)) ) >= 1 )"; 4 System.out.println(s); 5 System.out.println(s.replace(",", ".0,").replace("))", ".0))")); 6 } 7}

replace の代わりに replaceAll を使うと、正規表現を使ったことになるのかな?

追記
元のコードの修正を最小限にしようとすると、
String intStr = intStrList[x].replaceFirst("[^0-9].*", "");
String intStr = intStrList[x].replaceAll(".*\(|\).*", "");
に変えれば、何とかなりそうですが、その後で repalceFirst を使っている限り、
"(0,1,2,1,2)" は正しく置換されませんよ。

追記2
split を使うと、

java

1class Main { 2 public static void main(String[] args) { 3 String s = "gold in (0,1,2,10,11)) ) >= 1 )"; 4 String s2 = s.replaceAll(".*\(|\).*", ""); 5 String[] ss = s2.split(","); 6 for (int i = 0; i < ss.length; i++) ss[i] += ".0"; 7 System.out.println(s); 8 System.out.println(s.replace(s2, String.join(",", ss))); 9 } 10}

投稿2021/08/17 15:34

編集2021/08/17 22:32
kazuma-s

総合スコア8224

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

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

niboshi39

2021/08/18 12:44

ご回答いただき本当にありがとうございます。 おかげ様で解決しました。 たしかに()内を対象になるようにすればよかったです。
guest

0

String intStr = intStrList[x].replaceFirst("[^0-9].*", "");

どう考えてもここの"[^0-9].*"がダメですね。これだと『数字以外文字を見つけたらそこから後ろ全部』ですよ。

投稿2021/08/17 14:46

ishina_yum

総合スコア509

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

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

niboshi39

2021/08/17 15:19 編集

有難うございます。 たしかに! "[^0-9].*" を ".*[^0-9]" に変えると 0 が対象となり、末尾の 11 が変換されなくなりました。 "[^0-9]"はダメなんですね,,,明日、正規表現周りを見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問