- ベストアンサー
正規表現の一致について
- 正規表現のパターンマッチについて、EUC-JPで処理する方法について質問させていただきます。
- 現在、EUC-JPでパターンマッチングしている際、文章の変換処理を行っていますが、部分的な一致ではなく完全一致を求めています。
- 具体的には、文章中の特定の単語が部分的に一致してしまうことがあり、完全一致の方法を知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
$| = 1; my $aaa = "ローランド ディー.ジー."; my $bbb = "ローランド ディー.ジー."; $bbb =~ m/$aaa/; open File, ">test.txt"; print File "$&"; --------------------------------------------------- 上記をコピーし、EUCとして保存し、Perlで実行させてください。 成功しました。 どのように実行させてるかは分かりませんが、 Perlで実行する際は、他のアプリケーションを介さないで下さい。(テストになりません)。 -------------------------------------------------- sjisでの場合は、ーの2バイト目が5Cになる事も覚えておいて下さい。 http://ash.jp/code/codetbl2.htm -------------------------------------------------- テストはしていませんが、 foreach(@list){ if($file =~ /$_/){ print"$_\n"; } } この記述で $_ が[ランド]と出力される場合、 そもそも @list に[ランド]が入っていたとしか考えられません。 (正規表現関係ないです)。 その辺も見直してください。 ------------------------------------------------- > 結果の方は、変わりませんでした。 > listのローランド_ディー.ジー.のところでは、”ランド”と出力されてしまいます。 > なぜでしょうか。 そもそも $_ 自体が[ランド]だと思われるので、 そうだとしたら、そうなって当たり前の流れに感じます。 ------------------------------------------------- 質問の趣旨と異なりますが、 どうゆう意図の記述かわかりませんが、 おそらくではありますが、正規表現は m/\Q$_\E/; としたほうがたぶん意図したとおりに動作する気がします。 (記号を通常の文字として扱う)。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ちと手元で実験してみました. スクリプトはこんなん: $file = 'トヨタ:ランドクルーザー'; @data = ('トヨタ', 'ローランド ディー.ジー.'); for my $d (@data) { if ($file =~ /$d/) { print "matched: `$&'\n"; } else { print "unmatched\n"; } } で, 文字コードを EUC-JP にすると期待通りの結果 ('トヨタ' だけマッチ) になります. shift_jis だと正規表現のコンパイルに失敗する. ということで, それらの文字列の文字コードがどうなっているか確認してみてください. 今どきの Perl なら Unicode にするってのも 1つの方針.
お礼
ご返答ありがとうございます。 EUC-JPで行っていったところ、 リストの方にShift-jisで書かれたものが混じっていたのが原因のようでした。 再度、改行コードも含めてEUCに変換し直したらちゃんとマッチングいたしました。 わざわざ実験までしていただいて、申し訳ないです。 解決しましたので、お礼と主に報告いたしました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「print"$_\n"をみると、$file中の「:ランドクルーザー」という部分の”ランド”部分のみが出力されてきました。」 ってのがよくわからんのだけど.... なんで $_ を見るんだろ. $& の方が適切じゃないかなぁ? とりあえずここだけ見ても分からんような気がする. 「文字単位」でマッチかければうまくいくような気がするので.
補足
$&ってマッチングした文字列を返してくれるのですね。 この特殊変数の存在を知りませんでした。 $&の方が、適切ですね。ありがとうございます。 しかし、 結果の方は、変わりませんでした。 例えば、$fileの中身一部が、 「トヨタ:ランドクルーザー」で、 @listの中身は、 「ローランド_ディー.ジー.」(_は、全角空白) 「トヨタ」 等がある場合に、 foreach(@list){ if($file =~ /$_/){ print"$&\n"; } } と表記し、実行した場合、 listのトヨタのところでは、”トヨタ”と出力するのですが、 listのローランド_ディー.ジー.のところでは、”ランド”と出力されてしまいます。 なぜでしょうか。
お礼
ご返答ありがとうございます。 SaLeeFAさんの言うとおり、 リストの方に問題がありました。 Shift-jisで書かれたものが混じっていたのが原因のようです。 再度、改行コードも踏まえ、EUCに変換し直したらちゃんとマッチングいたしました。 わざわざコピーと実行までしていただいて、申し訳ない限りです。 解決しましたので、お礼と主に報告いたします。