• ベストアンサー

文字列の置換について。

ダブルコーテーションで囲まれ文字列が あったとします。 その文字列の中に含まれる半角カンマを なくしたいのですが、 リプレイスだと反応がありません。 その他の文字は置換出来るのですが。 どなたから、ダブルコーテーションに囲まれた 文字列の中の半角カンマを取り除く方法が ありましたらアドバイス下さい。 どうぞよろしくお願いします。

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

ああ、そういうことでしたか。 それなら、単純なreplaceでは対応できません。 御自身でお書きの通り、splitは単純に分割するもので、ダブルクォートの外とか中とかを考慮しません。 replaceも同様に、外と中を考慮しません。 先にreplaceすれば、splitで分割できなくなるし、先にsplitを先にすれば、ダブルクォートの中のカンマでも分割され、そのあとreplaceしようにもカンマ自体がありません。 ダブルクォートで囲まれた範囲を別に処理する必要があります。 「java csv パーサ」で検索してみてください。

ITJack
質問者

お礼

java csv パーサで調べてやってみます。 本来配列以外で、カンマが入る場合は 配列の区切り自体|(バーティカルバー)区切りにしてもらうと こうした問題がおきなくて管理しやすいのですが… どうもありがとうございました。

その他の回答 (3)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.3

単独で機能しているのならば、どこかで処理が間違っている可能性が大です。 EclipseやNetBeansのようなIDEのデバッグモードを使用したり、 Sysytem.out.println()を埋め込むなりして、想定結果と異なる箇所を特定しましょう。 稀に機能しないなど、偶発的なものなら間違っている箇所を特定することは困難ですが、 ほぼ機能していないならば、最初から最後までの処理を読めばいいだけなので、特定は容易な方です。

ITJack
質問者

補足

アドバイスどうもありがとうございます。 エラーが出るのは、生データをいじって中身がおかしくなっていたようです。 改めて試したのですが 出力は出来ますが、 while((line = in.readLine()) != null) { 配列line = line.split(","); で、半角カンマ区切りで読み込んでますので 配列ごとに先に分割されてしまうようですので リプレイス等で、半角カンマを置換できずに 配列ごとに分割されてしまうようです。 Sysytem.out.println()の実行結果ですと 例  実行前 "あいう,えお" ,かきくけこ     実行後 "あいう           えお"           かきくけこ のようになってしまいます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

import java.util.regex.*; class b { public static void main(String argv[]) { String c="ab,abc,de"; // 補足にあったコード String text = new String(c); Pattern pattern = Pattern.compile(","); Matcher matcher = pattern.matcher(text); StringBuffer appStrBuf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(appStrBuf, " "); } matcher.appendTail(appStrBuf); // 単純なreplace String c0=c.replace(","," "); String c1=c.replaceAll(","," "); System.out.println(c); System.out.println(appStrBuf); System.out.println(c0); System.out.println(c1); } } → ab,abc,de // もとのcは変化しない ab abc de // appStrBuf ab abc de // String.replace ab abc de // String.replaceAll となりますけど。

ITJack
質問者

補足

アドバイスどうもありがとうございます。 単体の実行結果で検証すると半角カンマは置換できます。 半角カンマのままですと、反応しないというより エラーでテキスト入出力出来ません。 テキスト全体のフィールドごとの区切りを private static String Sign() { String Verticalbar = "|"; return commaorVerticalbar;} バーティカルバー区切りにしてもダメです。 全体のプログラムに問題があるのでしょうか。 現状は半角カンマを全角カンマに修正してから テキスト入出力しています。 もう少し色々試してみます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

具体的にどうやったのですか? http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace%28char,%20char%29 http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replace(java.lang.CharSequence,%20java.lang.CharSequence) http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#replaceAll(java.lang.String,%20java.lang.String) どれでもできそうですけど

ITJack
質問者

補足

String text = new String(c); Pattern pattern = Pattern.compile(","); Matcher matcher = pattern.matcher(text); StringBuffer appStrBuf = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(appStrBuf, " "); } matcher.appendTail(appStrBuf); Systemout.print(appStrBuf); } のようにして半角カンマをスペースにしたりとか 単純に c.replaceAll(","," ");のようにして反応がありません。 その他の文字は置換できます。

関連するQ&A

  • 文字列に含まれているダブルクォーテーション( ")を置換する

    文字列に含まれているダブルクォーテーションを除きたいのですが、これをSubstitute関数で置換しようとしてもうまくいきません。ダブルクォーテーションが文字列を指定するために使われるせいだと思うのですが、"を文字列として指定する方法はあるのでしょうか? よろしくお願いします。

  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • EXCELでの置換でコーテーションを残す方法

    どなたか教えて下さい。 EXCELの置換(「編集」-「置換」)で文字列の置換は出来るのですが、 ” :ダブルコーテーション から ’ :シングルコーテーション に置換したいのですが、その場合、セルの先頭のシングルコーテーションが文字列の始まりと捕らえられ消えてしまいます。 これをそのまま残す方法はありますか?

  • ダブルクォーテーションが置換できません

    いつもお世話になっております。 PHP初心者です。 シングルクォーテーションとダブルクォーテーションを文字列として入力したいと思い、以下のように記述しました。 -------------------------------------------------- $naiyo = $_POST['naiyo']; $search = array('\'','"'); $replace = array('\'\'','\"'); $naiyo2 = str_replace($search,$replace,$naiyo); -------------------------------------------------- シングルクォーテーションは置換された(文字列として表示された)のですが、ダブルクォーテーションは表示されず、ダブルクォーテーション以下の文字列が消えてしまいます。 置換ができていないというよりも、そもそもダブルクォーテーションが検索に引っかかってもいないようです。 どのようにすればダブルクォーテーションも置換できるか、お分かりの方がいらっしゃいましたらご教示ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • {0>と<0}ではさまれた文字列の置換

    Word文書中で、記号{0>と<0}にはさまれた1文字以上の文字列を、これらの記号も含めて半角スーペスに一括置換する方法を教えてください。Wordのバージョンは、2003です。たとえば、 私の名{0>前は山<0}田太郎です。 上記の文なら、置換後は下記のようになって欲しいのです。 私の名 田太郎です。 なお、{0>と<0}の記号自体は置換できないが、はさまれた文字列をスペースに変換することならできる、という回答でも歓迎いたします。つまり、 下記のようになります。 私の名{0> <0}田太郎です。

  • 置換のことで

    エクセルの置換のVBAのことですが。 あるシートに沢山の文字列が入力されています。 abcという文字列が含まれるセルの最後の部分は、必ず以下のようになります。 カンマ 半角スペース 数字 カンマ 半角スペース 数字  閉じカッコ  ,             13    ,            56       ) 数字はばらばらで、1桁か2桁のどちらかで0はないです。 このような状況で、閉じカッコの左側の数字を全て 1 に置換するVBAが知りたいのですが。

  • VBAの文字列の中に”(全角のダブルコーテーション)を使う

    VBAのStringの中に”(全角のダブルコーテーション)を使おうとしているのですが、VisualBasicEditorにより自動的に ""(半角のダブルコーテーション2つ)に変換されてしまいます。 Dim str as String str = "abc”def"    ↓ str = "abc""def" 文字列中に全角のダブルコーテーションを使う方法を教えてください。よろしくお願いします。

  • c言語の文字、また文字列について

    c言語の文字、つまり「'(シングルクオーテーション)」で囲んだ単数の半角文字は、メモリに保存されているのでしょうか。 また、アドレスは有るのでしょうか。 c言語の文字列、つまり「"(ダブルクオーテーション)」で囲んだ複数の文字は、メモリに保存されているのでしょうか。 また、アドレスは有るのでしょうか。

  • 文字列置換について

    4901777␣品名A␣規格A␣日付␣␣␣␣␣6280␣␣␣␣7780 4901879␣品名B␣規格B␣日付␣␣␣␣␣6887␣␣␣␣9856 のような文字列があります。 【品名】と【規格】の間の半角空白を置換し 4901777␣品名規格␣日付␣␣␣␣␣6280␣␣␣␣7780 のように置換したいのですが正規表現ではどのように表したらいいでしょうか? ・【品名】と【規格】は全て大文字 ・【品名】と【規格】の箇所は文字列の始まり文字は不確定

  • エクセルのマクロで文字の置換について

    エクセルのマクロを使った文字の置換についてお聞きしたことがありましす。 やりたいイメージは例として添付の画像としてアップしましたが、 ・エクセルシートに英数文字列の表がある(例では2行2列ですが、実際は6行48列ぐらいです) ・その表を各英数文字列の間に半角カンマ","を入れて、メモ帳に貼り付けたい   ※実際メモ帳に貼り付ける動作は手動で行うので、クリップボード上で「各英数文字列    の間に半角カンマ","が入っている状態」で構いません。 ・各英数文字列の最初の2文字は必ず"0a"、その後の英数字は3桁または4桁です。 ちなみに、エクセルシートで英数文字列の表をそのままコピーしてメモ帳でペーストすると 各英数文字列の間にスペース(空白)が入ってしまいます。 その後、メモ帳で置換などを使い半角カンマ","を入れてもいいのですが、そこまでをマクロで行いたいと思っております。 上記のことがそもそもエクセルのマクロで出来るかどか分かりませんが、なにか有用な方法がございましたらご教授お願い致します。  ※使用OS:Windows7、エクセルバージョン:2007