2013-04-15 9 views
8

...

に署名スローcalSubject。

対象変数は、ファイルの動的な件名行です。例えば、そうです: Calnot = [calEvent]

私がしようとしているのは、calEventプレースホルダーをsubject変数に置き換えることです。件名に$記号が含まれているとクラッシュするため、どうやって動作しませんでした。

どのように私はこれを行うことができますので、件名に$記号やその文字が含まれている場合は壊れませんか?

+0

を使用してくださいスタックトレースを持っていますか、それとも単に何も置き換えていないのですか? –

+0

IllegalArgumentExceptionが発生していますか? – Jops

+0

エラー:java.lang.IndexOutOfBoundsException:グループがありません3 – OakvilleWork

答えて

20

ドル記号は置換文字列内の特殊文字であるため、この種の文字をエスケープするにはMatcher.quoteReplacement()を使用します。 String.replaceAll()のドキュメントから

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 

:交換 文字列内のバックスラッシュ(\)とドル記号($が)それは が治療を受けていた場合の結果がより異なるように引き起こす可能性があること

注意リテラル置換文字列として; Matcher.replaceAllを参照してください。必要に応じて、 Matcher.quoteReplacement(java.lang.String)を使用して、これらの文字の特殊な意味を抑止します( )。

ドル記号は、正規表現($0$1、等)に対応する捕捉基を指すために使用されることに留意されたいです。あなたは、あなたが文字列の中で\$でそれを置き換えることによって、手動で$をエスケープする必要があるのJava 1.4で立ち往生している場合

EDIT

Matcher.quoteReplacement()は、Javaの1.5で導入されました。しかし、String.replaceAll()\$を特殊文字として使用するため、一度エスケープする必要があります。また、Javaランタイムの場合は\をもう一度エスケープする必要があります。

("$", "\$") /* what we want */ 
("\$", "\\\$") /* RegExp engine escape */ 
("\\$", "\\\\\\$") /* Java runtime escape */ 

だから我々が得る:

calSubject = calSubject.replaceAll("\\$", "\\\\\\$"); 
+0

こんにちは、提案のおかげで..プログラムは、Java 1.4を使用し、それは動作していないようです。私はそれをローカルでデバッグすることができないので、言うのは難しいです。それを解決するためにログを使用するだけです。 java 1.4はサポートしていません: Matcher.quoteReplacement? – OakvilleWork

+0

私の最後の編集を参照してください。 – zakinster

+0

キャプチャグループを参照するためにドル記号が使用されていることをJava正規表現の文書に記載していますか? –

5

あなたがregex機能を必要としない場合、あなたはStringクラスのこのメソッドを使用することを検討することができます。 replace(CharSequence target,CharSequence replacement)

それだけでなく、あなたの「エスケープ」バックスラッシュを保存します。

APIドキュメント:

は、指定されたリテラル置換シーケンスとリテラル標的 配列と一致し、この文字列の各部分を置き換え。 文字列の先頭から末尾に置換が進みます。例: の場合、文字列 "aaa"の "aa"を "b"に置き換えると、 "ab"ではなく "012a"になります。

+0

あなたはこれの例を挙げることができますか? – OakvilleWork

+1

JDK 1.5では 'replace()'メソッドのオーバーロードが追加され、OPはJDK 1.4でスタックされています。また、['replace(char、char)'](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28char,%20char%)は使用できません。新しい値は単一の 'char'ではないからです。 –

+0

@AlanMoore私が投稿したとき、OPは1.4に関する情報は何も言及していませんでした。しかしあなたが正しいです、この方法は1.5以降です。 – Kent

2

でReplaceAllのドキュメントから:

注交換 文字列内のバックスラッシュ()とドル記号($)は結果を引き起こす可能性があることリテラル置換文字列として扱われた場合とは異なります。 Matcher.replaceAllを参照してください。必要に応じて java.util.regex.Matcher.quoteReplacementを使用して、これらの文字の特殊な意味を抑止します( )。

そしてMatcher.replaceAll

ドル記号は上記 として捕捉サブへの参照として処理することができる、及びバックスラッシュはリテラル文字を置換文字列で をエスケープするために使用されます。

0

ない私は本当にあなたの質問を理解しますが

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 
0

を試してみてください、あなたはそれがクラッシュしたと言うとき、あなたは何を意味するのですか?

Matcher.quoteReplacement(calEvent); 
関連する問題