- PR -

正規表現を使わない置換 (JRE1.40で)

投稿者投稿内容
会議室デビュー日: 2003/12/17
投稿数: 9
投稿日時: 2006-02-28 07:35
こんにちは。

 JRE1.50で開発をしているのですが、文字列に置換で困っています。
文字列の置換には str.replaceall(srcString,dstString)を使用しますよね。
正規表現を無効にして置換する場合、私はstr.replace(srcString,dstString)としていたのですが、実行環境JRE1.40では下記のようなエラーが出てしまいます。
java.lang.NoSuchMethodError: java.lang.String: method replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; not found

いろいろ調べると、どうもこのreplaceは1.40では文字単位での置換しかできないみたいです。
こんな感じ>str.replace( 'A','X' )

1.40で正規表現を使わない文字列置換はできないものでしょうか。
ご存知のかたがいらっしゃいましたら教えてください。
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-02-28 08:51
 String.replaceAllよりも手間がかかりますが、java.util.StringTokenizer
によって文字列を分割した後、置換後の文字列を付加しながら連結という方法
はどうでしょうか?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-02-28 09:34
あるいは、StringBufferを使って自前でちまちま置換するかですね。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2006-02-28 09:58
普通に標準の正規表現ライブラリを使っちゃだめなんですか?
(「標準の」が抜けてましたね。)


[ メッセージ編集済み 編集者: おっきー 編集日時 2006-02-28 17:00 ]
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-02-28 10:07
こんにちは、さくらばです。

引用:

おっきーさんの書き込み (2006-02-28 09:58) より:
普通に正規表現ライブラリを使っちゃだめなんですか?



というより、J2SE 1.4 は標準で正規表現が使えるのですから、
正規表現を使えばいいと思うのですが...

参考:
http://www.javainthebox.net/laboratory/JDK1.4/NewIO/RegularExpressions/RegularExpressions.html

Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-28 10:31
replace()の代わりに使いたいだけなら、replaceFirst()ならどうなんでしょうね。
正規表現を使わない、といっても、
そもそもreplaceAll()は正規表現による置換なんですが。
会議室デビュー日: 2003/12/17
投稿数: 9
投稿日時: 2006-02-28 22:30
皆様どうもありがとうございます。

正規表現を使いたくなかった理由は、雑多な文字列を雑多な文字列で置換するので、正規表現に解釈されるとまずかったのです。

replaceFirst()も正規表現を解釈するようですし、TokenizerやStringBufferでちまちまやるしかないみたいですね・・

或いは変換対象文字列を強制的にエスケープするとか(abc.* → \a\b\c\.\*)?
ちょっと試してみます。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-03-01 09:13
こんにちは、さくらばです。

引用:

tさんの書き込み (2006-02-28 22:30) より:
正規表現を使いたくなかった理由は、雑多な文字列を雑多な文字列で置換するので、正規表現に解釈されるとまずかったのです。

replaceFirst()も正規表現を解釈するようですし、TokenizerやStringBufferでちまちまやるしかないみたいですね・・



J2SE 5.0 の String#replace(rCharSequence target, CharSequence replacement) も
内部は正規表現を使ってますが...

ようするに文字列を正規表現のパターンとしないでそのまま (リテラル) として
扱いたいわけですよね。だったら、次のようなメソッドで文字列をリテラルに変換
してから、Matcher#replaceAll で置換すればいいのではないでしょうか。

コード:

public String toLiteral(String src) {
if (src.indexOf('\\') == -1 && src.indexOf('$') == -1) {
return src;
}

StringBuffer buffer = new StringBuffer();
for (int i=0; i < src.length(); i++) {
char c = src.charAt(i);
if (c == '\\') {
buffer.append('\\');
buffer.append('\\');
} else if (c == '$') {
buffer.append('\\');
buffer.append('$');
} else {
buffer.append(c);
}
}

return buffer.toString();
}




[ メッセージ編集済み 編集者: さくらば 編集日時 2006-03-01 09:16 ]

スキルアップ/キャリアアップ(JOB@IT)