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

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

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

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

Q&A

解決済

3回答

6991閲覧

Java replaceAllのエスケープについて

mahoken

総合スコア85

Java

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

0グッド

0クリップ

投稿2016/06/08 04:48

編集2016/06/08 05:39

質問させていただきます。
Java8
PlayFrameWork1

StringBuilder sb = new StringBuilder();

//str 正規表現("a'b{10,1}"(適当))
String str ="a'b{10,1}";
String escaped = str.replaceAll("'", "''")
.replaceAll("{","\{")
.replaceAll("}","\}");

sb.apend(MessageFormat.format(escaped,object));

と言った形で[ ' ]と[ { ]と[ } ]をエスケープしてsbにapendしたいのですが、

JavaExecutionException: unknown format type: 1

IllegalArgumentException

が出てしまい成功しません。

どなたかご教授ください。。

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

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

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

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

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

KiyoshiMotoki

2016/06/08 05:30

「エスケープして処理を成功させたい」というのが具体的にどういうことか、よく分かりません。"a'b{10,1}" をどのような文字列に置換したいのか、明記してください。
mahoken

2016/06/08 05:37

一部修正しました。伝わるでしょうか.
guest

回答3

0

ベストアンサー

「JavaExecutionException: unknown format type: 1 」「IllegalArgumentException」というエラーメッセージから見て、replaceAllの問題というよりもMessageFormatに渡すパターン文字列の書式の話なのかと思いました。

「str="a'b{10,1}"」の場合に「MessageFormat.format(escaped,object)」の結果がどのようになることを想定されてるのでしょうか?

結果が「a'b{10,1}」のままでいいのなら特殊文字だけをエスケープして「escaped = "a''b'{'10,1'}'"」になるように置換すればいいだけです。

その場合、

java

1escaped = str.replaceAll("'","''").replaceAll("(\\{|\\})", "'$1'");

こんな感じになるのではないでしょうか。

投稿2016/06/08 06:21

tkturbo

総合スコア5572

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

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

mahoken

2016/06/08 06:32

<input>要素のvalue値に入れたくて(sb = htmlの集合体)、実装したのですが、提示頂いたコードでもエラーが出てしまうみたいです。。 知識不足、情報不足で申し訳ありません。
guest

0

情報の追記、ありがとうございます。

見たところ、MessageFormatクラス自体の使用方法を誤っているように見受けます。

まず、MessageFormat.formatメソッドの第一引数にわたす文字列では、'{'と'}'をエスケープする必要はありません。
次に、'{10,1}'の'10'部分には0から始まる数字を指定しますので、通常、いきなり 10 から始まることはありません。
同じく'1'部分に指定できる文字列は number, date, time, choice のいずれかのみです。

詳しい使用方法はAPIリファレンスを読んでみてください。
https://docs.oracle.com/javase/jp/8/docs/api/java/text/MessageFormat.html

また、断片的にではなくもっと全体的なコードを提示していただくと、さらに具体的な回答が得られるかもしれません。

投稿2016/06/08 06:17

編集2016/06/08 06:29
KiyoshiMotoki

総合スコア4791

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

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

mahoken

2016/06/08 06:27

ご回答ありがとうございます。 リファレンス見てみます!
guest

0

外してたらすみません。
{}は正規表現で特殊な文字となるので、replaceAllではエスケープする必要があるようです。
Pattern.quoteを使うことでエスケープすることができるようです。

java

1import java.util.regex.Pattern; 2 3String str ="a'b{10,1}"; 4str.replaceAll(Pattern.quote("{"),"");

投稿2016/06/08 05:41

ttyp03

総合スコア16998

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

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

mahoken

2016/06/08 05:46

回答ありがとうございます。 str.replaceAll(Pattern.quote("{"),""); だと "a'b10,1"となってしまうと思いますが、 エラーを出さずに"a'b{10,1}"のままsb.apendすることは可能でしょうか。。
ttyp03

2016/06/08 05:56

コードが修正される前に書いたサンプルなので、適当に修正してください。
ttyp03

2016/06/08 05:58

一応書いてみました。 String escaped = str.replaceAll("'", "''") .replaceAll(Pattern.quote("{"),"\\{") .replaceAll(Pattern.quote("}"),"\\}");
mahoken

2016/06/08 06:05

ありがとうございます。 こちらも試してみましたが、MessageFormatの方でエラーが出てしまうみたいです。。 JavaExecutionException: unknown format type: 1
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問