- ベストアンサー
日本語を含む正規表現の置換
日本語を含む文字列が$word1、$word2 があります。 $word1から"(xxx)"というような半角カッコに囲まれた文字を削除したいです。 $word2からは"(xxx)"というような全角カッコに囲まれた文字を削除したいです。 カッコの中の文字xxx(日本語)は不特定です。 $word1は以下のコードで上手くいきました。 $word1=~ s/\(.*?\)//; しかし$word2が上手くいきません。 基本的なことかもしれませんが、 色々やってみても上手くいかないので、 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
さしあたり手元の Linux + perl 5.8.8 で次のコードは動いてます. スクリプトそのものは shift-jis ですが, 表示するコンソールは euc じゃないといけないので use encoding が変ですが. #!/usr/local/bin/perl use encoding 'shift-jis', STDOUT => 'euc-jp'; $data = '(abacaa)'; if ($data =~ /((.*))/) { print "$1\n"; } else { print "unmatched.\n"; }
その他の回答 (5)
- bgbg
- ベストアンサー率53% (94/175)
> 試しに全角カッコの1文字"("だと上手く認識できました。 とありますが、")"だとうまくいかないのですか? とすると、文字列中に出てくる閉じ括弧が全角でないのでは?
補足
言葉足らずですみません。 全角カッコ1文字は "(" 、 ")" とも上手くいきました。 全角カッコの1文字1文字は認識できるのですが、 カッコとそのカッコにはさまれた文字をとりだそうとした 正規表現が上手くいきません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>回答いただいたものは、実は既に試していて、置換ができませんでした。 うまくいかなかったデータについて、どんなものがうまくいかなかったのか教えてください
補足
まず初めに試したのが、1で回答いただいたものです。 $word2 =~ s/(.*?)//; 全角のカッコが認識できていないのかと思い、 全角カッコだけで試してみました。 $word2=~ s/(//; 全角カッコ1文字だと正しく認識できました。 他にもネットで調べて、いくつか適当に試してみたのですが、上手くいきませんでした。 試したソースは憶えていませんm(__)m
- bgbg
- ベストアンサー率53% (94/175)
・スクリプトの文字コード、$word1と$word2の文字列の文字コードは本当にShift-JISですか? スクリプトの文字コードが違う、という可能性があるかもしれません。 $word1と$word2がShift-JISで確定なら、生のバイト値で指定するのも一つの手でしょう。 $word2 =~ s/\x81\x69.*?\x81\x6A//g;
お礼
回答ありがとうございます。 直前にjcodeで変換しているので、文字コードはShift-JISで間違いないと思います。 ただ、回答いただいたバイト値で指定する方法をやってみましたが、うまくいきませんでした。
- Tacosan
- ベストアンサー率23% (3656/15482)
・どのようなコードで ・どのようなデータに対して ・どのようにうまくいかないのか を書いてください.
補足
説明不足ですみません。 データはDBから抽出するので、不特定です。 データの中にカッコ書きが含まれているものがあるので、カッコ書きの部分を削除したいです。 カッコが半角の場合は上手く削除できたのですが、 カッコが全角の場合は、削除できませんでした。 試しに全角カッコの1文字"("だと上手く認識できました。 $word2=~ s/(//; やりたいのは全角カッコとその間にある文字を削除したいのですが、その方法がわかりません。 よろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
$word2 =~ s/(.*?)//;
補足
回答ありがとうございます。 回答いただいたものは、実は既に試していて、 置換ができませんでした。 書き忘れていたのですが、文字コードはShift_JISです。 既に存在するプログラムに組み込むので、文字コードの変更なしでやりたいのですが、 Shift_JISだから上手くできないのでしょうか? よろしくお願いしますm(__)m
お礼
上手くできました! ありがとうございます。 本当に助かりましたm(__)m