- PR -

正規表現

1
投稿者投稿内容
elwood
会議室デビュー日: 2003/07/24
投稿数: 12
投稿日時: 2004-11-17 14:24
こんにちは。

初歩的な質問だと思うのですが、ちょっと行き詰ってしまったので
質問させていただきます。

「?(半角ハテナ)」を含んでいる文字列の中の「?」を
別な文字に置き換えようとしています。
String#replaceAllメソッドを使用したいのですが、
正規表現としての「?」として認識されてしまい、
うまく置換する事ができません。
例:
String str = "abcdef?";
System.Out.Println(str.replaceAll("?" , "hoge");

このようにするとPatternSyntaxExceptionが発生します。

APIドキュメントのPatternクラスを参照して、
str.replaceAll("\\p{?}" , "hoge");
とすると、エスケープシーケンスが無効です、と
コンパイルエラーが発生します。

おそらく簡単な所でつまづいていると思うのですが、
どなたかアドバイスいただければ幸いです。

それでは。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-17 14:39
System.Out.Println(str.replaceAll("\\?" , "hoge");
でどうですか。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-11-17 14:40
引用:

elwoodさんの書き込み (2004-11-17 14:24) より:

「?(半角ハテナ)」を含んでいる文字列の中の「?」を
別な文字に置き換えようとしています。
String#replaceAllメソッドを使用したいのですが、
正規表現としての「?」として認識されてしまい、
うまく置換する事ができません。
例:
String str = "abcdef?";
System.Out.Println(str.replaceAll("?" , "hoge");

このようにするとPatternSyntaxExceptionが発生します。

APIドキュメントのPatternクラスを参照して、
str.replaceAll("\p{?}" , "hoge");
とすると、エスケープシーケンスが無効です、と
コンパイルエラーが発生します。


?をエスケープして"\?"で良いんじゃないですか。
str.replaceAll("\\?" , "hoge");

または"?"はコードで表すと0x3Fなので
str.replaceAll("\\x3f" , "hoge");

str.replaceAll("\\u003f" , "hoge");
で良いんじゃないでしょうか。
\p{...}はまるっきり関係ないです。
影フリー
常連さん
会議室デビュー日: 2004/11/12
投稿数: 39
お住まい・勤務地: 東京都
投稿日時: 2004-11-17 14:58
これはどうですか?
---------------
public static String rplc(String str, String n1, String n2) {
int itmp = 0;
if (str==null) return "";

String tmp = str;
StringBuffer sb = new StringBuffer();
sb.append("");
while (tmp.indexOf(n1)>-1) {
itmp = tmp.indexOf(n1);
sb.append(tmp.substring(0,itmp));
sb.append(n2);
tmp = tmp.substring(itmp+n1.length());
}
sb.append(tmp);
return sb.toString();
}
---------------
使い方は String str = rplc( str, "?", "hoge" );
J2SDK1.4以下のシステムであればreplaceAll代わりによいです。
速度もreplaceAllより早いと思うんですが・・
未記入
会議室デビュー日: 2003/09/24
投稿数: 18
投稿日時: 2004-11-17 15:25
引用:

正規表現としての「?」として認識されてしまい、
うまく置換する事ができません。
例:
String str = "abcdef?";
System.Out.Println(str.replaceAll("?" , "hoge");



お疲れさまです。
\をjavaの文字として認識するためにエスケープする必要があるので、
正規表現のエスケープとあわせて二つ必要です。
また、replaceAllは戻り値がStringです。
なので、下記のコードで上手くいくと思います。

String str = "abcdef?";
str = str.replaceAll("\\?","test");
System.out.println(str);
elwood
会議室デビュー日: 2003/07/24
投稿数: 12
投稿日時: 2004-11-17 15:43
皆さん回答ありがとうございました。
str.replaceAll("\\?", "hoge");
で置換することができました。

また、影フリーさんの置換メソッドも便利そうなので、
使わせていただきます。

有難うございました。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-11-17 16:00
引用:

影フリーさんの書き込み (2004-11-17 14:58) より:
これはどうですか?
---------------
:(中略)
J2SDK1.4以下のシステムであればreplaceAll代わりによいです。
速度もreplaceAllより早いと思うんですが・・


速度重視ならindexOfの呼出回数を減らすとなお良いです。速度的には微々たる差ですが。
コード:
    public static String rplc(String str, String n1, String n2) {
        if (str==null) return "";
        
        String tmp = str;
        StringBuffer sb = new StringBuffer();
        // sb.append("");           //不要
        int itmp = tmp.indexOf(n1); //ここ
        while (itmp>-1) {           //ここ
            sb.append(tmp.substring(0,itmp));
            sb.append(n2);
            tmp = tmp.substring(itmp+n1.length());
            itmp = tmp.indexOf(n1);  //ここ
        }
        sb.append(tmp);
        return sb.toString();
    }



関係ないですが、strがnullの時,空文字返すのは違和感があります…。
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-06 10:41
普通に置換
1

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