• ベストアンサー

replaceAllが使えない場合の取り除き

文字列から特定の文字を抜き出す処理をしたいです。 ちょっと調べてみたところ、replaceAllというものがあるそうで、こりゃいい!、とばかりにコーディングしてコンパイルしてみたのですが・・・。 JDKが1.3では使えなかったです・・・。 1.3で実現するにはどのようなコードを書いたらよいでしょうか? 確か、勉強し始めのころ、文字長をlength()でとって、一文字ずつ調べていって置換・・・ というようにしていたような気がしますが、 どのようなメソッドを使っていたかすっかり忘れてしまいました(ボケ webで調べても1.3はすでに過去の産物なのか、replaceAllの例ばかりが引っかかります。 簡単なサンプルがあるととても助かります。 よろしくお願いいたします。

  • Java
  • 回答数6
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

replaceAll もどきを作ってみました。 ---------------------------------------------------------------- public class Sample { public static String replaceAll(String source, String target, String replacement){ StringBuffer wk = new StringBuffer(source); int repLen = target.length(); int i=source.length(); while(i>=0){ i=source.lastIndexOf(target, i); if(i>=0){ wk.replace(i, i+repLen, replacement); i--; } } return wk.toString(); } public static void main(String[] args) { String str ="(ABC)(ABC)(ABC)"; String result = replaceAll(str, ")("," "); result = replaceAll(result, "(",""); result = replaceAll(result, ")",""); System.out.println(result); } }

azicyan
質問者

お礼

わざわざすみません! 早速コンパイルしてみました! いろいろ応用が利きそうなので、使わせていただきたいと思います。 ありがとうございます。

その他の回答 (5)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.6

//以下は「文字列置換」ではありませんが…。 import java.util.*; public class Demo { public static void main(String[] a){ String text="(((ABC)()()(ABC)()())(ABC)))D"; String delimit="()"; StringBuffer buffer=new StringBuffer(); StringTokenizer tknzr=new StringTokenizer(text,delimit); if(tknzr.hasMoreTokens()){ buffer.append(tknzr.nextToken()); } while(tknzr.hasMoreTokens()){ buffer.append(" ");//←全角スペース buffer.append(tknzr.nextToken()); } System.out.println("["+buffer.toString()+"]"); } }

azicyan
質問者

お礼

StringTokenizerですね! じつは私も昨日「文字列変換 java」で検索していたところ こちらが引っかかりまして、 使ってみました。これ便利ですよね! 回答ありがとうございました!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>char型で「何も無い」を表現するにはどうするのでしょうか・・・? char型で「何も無い」は、表現できないと思います。

azicyan
質問者

補足

では、文字列から任意の文字を削除はどうやるのでしょうか。 delphiにdelete()というのがあったのでJavaにもあるかなあ、と思ったのですが、 あったものの「ファイルをデリート」でした・・・

noname#15436
noname#15436
回答No.3

> )(を取り除いた後そこに全角のスペースをひとつ入れたいです。 これって,全角スペースへの「置換」ですよね? s.replase('(', ' '); // 2つ目のシングルクォートの中身は全角スペース では駄目なのでしょうか? 駄目ならその理由を補足してください。

azicyan
質問者

補足

回答ありがとうございます。 えっとですね・・・ (ABC)(ABC)(ABC) のようになっています。 すると(と)を消して全角空白に置換していくと、 文字と文字の間が全角空白2文字、になってしまうんです。 ですので、)に関しては空白、(にかんしては''とやれば良いかな・・・ と思ったのですが''はだめなんですよね・・・

回答No.2

もう悩んでないでそういうメソッド自作してしまえばいいのでは? public String myReplace(String s, char c) {  StringBuffer buf = new StringBuffer();  for (int i = 0, len = s.length(); i < len; i++) {   char sc = s.charAt(i);   if (sc != c)    buf.append(sc);  }  return buf.toString(); }

azicyan
質問者

お礼

ああ、そうでしたね! 1.3だとStringBufferに変換しないと出来ない処理がありましたね・・・ 1.4は結構ごまかしが利くようになっていますね・・・ しかし、実を申しますと、replace()というメソッドならあって、 引数は(char,char)なんですけど、for文を使わなくても文字列すべてに対して変換してくれるみたいです。 でも、入れ替えるときにはこれでいいのですが、”抜き取る”時にはどうしたら良いでしょうか? '('を''という風にやったらエラーになってしまいました。 そういえばcharの''ってだめでしたね・・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

取り除きをするのでしょうか? それとも抜き出しをするのでしょうか? それとも置換をするのでしょうか? 正規表現を使うのですか?

azicyan
質問者

補足

取り除きです。 もう少し言うと()が入ってしまっているので取り除いて、空白を入れたいです。 で・・・また少しわかったのですが、replaceAll()は無くてもreplace()があることがわかりました。 これでナントカできました!!・・・・ と思ったのですが、)(を取り除いた後そこに全角のスペースをひとつ入れたいです。 それでreplace('(',''); とやってみたのですが…!! char型で''というのはだめだってことを思い出しました。 char型で「何も無い」を表現するにはどうするのでしょうか・・・? nullでもだめでしたしもちろん””でもだめです・・・

関連するQ&A

  • replaceAllの使い方

    replaceAll(String regex, String replacement) 指定された正規表現に一致する、この文字列の各部分文字列に対し、指定された置換を実行します。 ということなので、 String str = "あ00a123"; String str2 = str.replaceAll("[^0-9]",""); で、str2は "00123" となると思ったのですが、実際はなりませんでした。 だめもとで思いつく限りの書き方を試してみたのですが、([]をとってみたり、replaceAll("あ","A")としてみたり…結局何の置換もできませんでした。 replaceAllの使い方教えていただきたいです。

    • ベストアンサー
    • Java
  • ファイル内の文字列を置換

    掲示板利用させていただきます。 現在、ファイル内の特定の文字列を置換し、 保存する方法を探しています。 できればスクリプト言語を利用したいと考えています。 sedコマンドを使用して文字列置換を行ったのですが 置換前と置換後のファイルで 文字コードと改行コードが変わってしまうのでダメでした; 「ファイル内の特定の文字列を任意の文字列に置換し、置換前と置換後で改行コードと文字コードを変えない方法」 をご存知の方、ご教示ください。 bash,perl,javaのどれでも結構です。 よろしくおねがいします。

  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • 秀丸 事前にリストを作って一括変換したい

    秀丸(Ver8.10)(OSはWindowsXP)を使っています。テキスト中の文字列を別の文字列に1つずつ置換することはできますが、多数ある場合は1つ1つ置換するのは大変です。変換する文字列の組のリストを事前に作成しておいて一括変換することはできないでしょうか。 (例) 変換前 ------------>変換後 I0001_01010 --------> I0001_00011 I002_1111 ----------> J00002_0110123 I0003_03234 --------> I005_012 : : (以下多数あります) (変換の法則性はありません) (変換する文字列はその都度変わりますので再実行や保存の必要はありません) (今は以下のようにreplaceallをマクロに記述して変換していますがもっと簡単に行える方法はないでしょうか) replaceall "I0001_01010" , "I0001_00011" , nohilight; replaceall "I002_1111" , "J00002_0110123" , nohilight; replaceall "I0003_03234" , "I005_012" , nohilight; よろしくお願いします。

  • SQLインジェクション対策で、エスケープ処理を行おうとしています。

    タイトルの通り、SQLインジェクション対策として、文字のエスケープ処理を行おうと考えています。 言語はJavaです。StringクラスのreplaceAllメソッドを使おうと考えています。 例えば以下の文字列の場合、 "AAA%BBB\%CCC" %という字を\%に置き換えようと思うのですが、そのまま%を\%に変更してしまうと、 "AAA\%BBB\\%CCC" となってしまいます。 これを防ぐため、1つ前の文字が\以外の文字の場合にのみ置換を行うようにしたいのですが、うまく行きません。 例えば replaceAll("[^\\\\]%","\\\\%"); という風にすると、 "AA\%BBB\%CCC" という風に1文字欠けてしまいます。 また、' (シングルクオーテーション)も同じような問題をかかえています。 単純に'を''に変えるのではなく、''となっている物はそれ以上変更を加えたくないのです。 ・・・そもそも本来、そういう文字列が渡されないような仕様にするべきなのですが、それもなかなか安心できず、出来れば実装したいのです。 どなたか方法を教えて頂けないでしょうか。

  • Javaの正規表現

    Javaのプログラムで文字列に含まれるスラッシュを 全てバックシュラッシュに置換したくてreplaceAllを使用しています。 しかし、正規表現がよく分からず、エラーとなります。 どう記述すれば良いでしょうか? string.replaceAll("\\/", "\\"); ではエラーとなり、第二引数を\や\\\としてもダメでした。

    • ベストアンサー
    • Java
  • 文字列置換

    文字列置換 htmlのbody内のタグではない(画面に表示される)特定の文字列を別の文字列に置き換えるコードはどう書けばいいのでしょうか?

  • JAVAでC/C++の条件コンパイルのようなことはできないでしょうか?

    JAVAでC/C++の条件コンパイルのようなことはできないでしょうか? 実行時に判断するのじゃなくて、 コンパイル時に判断するやり方ないですか? 開発ツール等の環境設定でやるとかじゃなくて・・。 C/C++の条件コンパイルのように、 ソースコーディングすることで、行うやり方。 (たとえば) もし、JDK1.4よりもバージョンがひくければ、 JDK1.3以前でも、存在するクラスを使って メイクする。 その代わりすごいおそーいけどね・・・。 もし、JDK1.4以上であれば とても、パフォーマンスのよいクラスを使った コードをメイクする。 その代わりこれは1.4以上でないと コンパイルできないけどね。 みたいな感じで、 実行時じゃなくて、 コンパイル時にソースコード で条件分岐させてしまうやりかたないですかぁ。 (ないだろうなぁ。) args[0]で起動時の引数で 実行時判断させようとしても、 そもそも、1.4からでてきたクラスとかだと 1.3ではコンパイルすらできない あと、 できれば、したい実現したい機能だけど、 それをするには1.4から登場した クラスを使わなければできないので、 1.3ではあきらめてもらい(そういう仕様にしてもらって) しないようにしようと思ったとする。 そして、 その処理が入ってない1.3版と、 その処理が入ってると1.4版とで、 その差分のせいで、 ソースのバージョンを2種類設ける ということを絶対にやりたくない時とか。 どうするんだろう・・。

    • ベストアンサー
    • Java
  • PatternSyntaxException

    こんにちは。 ある文字列の\マークを/に置き換えるために、 Pattern p = Pattern.compile("\\"); Matcher m = p.matcher("文字列"); String replaced = m.replaceAll("/"); としているのですが、 1行目でなぜかPatternSyntaxExceptionがスローされます。何かおかしいのでしょうか? ちなみにEclipseを用いてコーディングしています。

    • ベストアンサー
    • Java
  • ページの中から文字列を取り出すメソッドってある?

     なんか昔、図書館から借りてきた本で読んだような。。。  インターネットのホームページを見ていてそのページの中からある特定の文字を検索するプログラムを作りたいのですが、  そういうメソッドはないのでしょうか?もしあったらメソッド名を教えてください。  また、普通のテキストファイルからある特定の文字列を取り出すメソッドもあったら教えてください。  よろしければ、5~6行のコードも書いていただければありがたいです。 宜しくお願いします。

    • ベストアンサー
    • Java