

perl でこのマッチは失敗しますか?
my $one = "FEFRGrgarGEEeg+05fweaEFJIEI+A";
my $str = "FEFRGrgarGEEeg+05fweaEFJIEI+A";
if($str =~ m/$one/){
print "same";
}else{
print "difference";
}
exit;
5時間ほど悩んでそれらしいところを見つけたのですが、この部分で失敗しているようでした。
「+」記号がある為だと思うのですが、何故、このようなことになるのでしょうか?
このように、失敗するような避けるべき文字ありますか?
また、+記号などがあっても正しくマッチを使う方法はありますでしょうか?
No.5ベストアンサー
- 回答日時:
少なくとも最近の Perl なら「文字列に埋め込まれた \E によって \Q の効果が終了する」ということはないです. たとえば
use feature 'say';
$x = "a+\\Eb*?";
say qr/\Q$x\E/;
を実行すると
(?-xism:a\+\\Eb\*\?)
となり, \Q の効果が $x に埋め込まれた \E を越えて現れていることが確認できます. また, 実際に $x =~ /\Q$x\E/ でマッチさせても正しくマッチできています.
\Q \E の信頼性に不安があり使っていなかったですが、最近のPerlであれば安心して使えるのですね。
実例も紹介して頂き誠にありがとうございました!
No.4
- 回答日時:
・バージョン違い
どの言語にもある問題です。Perlに限ったことではありません。
例えば、 C#3.0で追加されたラムダ式はC#2.0では使えません。
・index
index自体は特殊な変換を一切行いません。
が、引数に使う文字列を指定する段階で変換される場合はあります。 例えば
my $a = "bbb";
index( $str, "x$a" )
とあった場合、""の中の$aが展開され,'xbbb'になります。
これは、ダブルクォートによる展開であって,indexによる変換ではありません。
・\Q\E
たとえば、$oneの中に\Eという文字列が含まれていた場合、
\Q$one\E
は$oneの中の\Eの直前まではそのまま、$oneの中の\E以降は正規表現としての特殊な意味を持つものとして解釈されます。
・UTF-8
これはまた別の問題です。
"perl unicode" で検索してください。
No.3
- 回答日時:
> 何故、このようなことになるのでしょうか?
m/$one/
は、変数$oneが展開されたあとで、それを「正規表現」として解釈します。
「変数$oneに入っている文字列にマッチ」ではありません。
$oneの中に正規表現での特殊な意味を持つ文字列が含まれていたら、その特殊な意味の通りに解釈されます。
特殊な表現はPerlのバージョンによっても若干違います。
特にPerlの正規表現は多機能で、特殊な表現もたくさんあります。
詳しくは、 「perl 正規表現」で検索するとか、 man perlreを読むとかしてください。
対策は既に出ている
・検索文字列を正規表現として適したものにする:特殊文字を\で無効にする、等
・\Q\Eで括って、特殊な意味を無効にする
があります。
また、単に二つの文字列が等しいかどうかを判定するなら
$str eq $one
と eq 演算子が使えます。(==ではありません)
文字列を含むかどうかを調べるだけなら
index $str, $one
rindex $str, $one
とindex関数,rindex関数が使えます。
詳細な説明ありがとうございます!
特殊な意味を持つ文字はいろいろあり、バージョンによっても違うのですね。
プログラムはperlとVC#が少しし使えませんが、時々、perlは嫌いという人を聞くのですが、
他の言語ではこういったことが少ないのでしょうか?
なお、今回は、一部マッチが必要ですので、indexも良いのですが、こちらは、特殊な意味を持つ文字も評価せず判断されるのでしょうか?
\Q\Eについて以前は全てのマッチで使っていたのですが、かなり昔で、どこで読んだか忘れてしまいましたが、万能ではなく誤作動する可能性があるので、使わない方がよいと聞いたことがあります。今は問題ないのでしょうか?(UTF8なら問題ない?)
もし、こちらの疑問についてもご存じでしたら回答いただけると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
メールアドレスの正規表現について
-
第二水準漢字が含まれるか?
-
正規表現で、青空文庫形式の入...
-
sedで正規表現の後方参照を使い...
-
C言語のコメントを「正規表現」...
-
python正規表現について
-
C言語にパターンマッチってない...
-
正規表現で囲まれた部分の文字列
-
grepの正規表現での最短マッチ...
-
正規表現でシングルクォーテー...
-
正規表現でAND検索はできる...
-
文章中全ての半角カッコ ( の...
-
MFCで正規表現
-
正規表現でカウントアップ(?)す...
-
vbaの正規表現で、マッチした一...
-
文字列検索(grepのようなもの)...
-
Mで始まりuで終わる文字列
-
正規表現で大文字小文字指定に...
-
Perl 数値にスラッシュを入れる...
おすすめ情報