

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で質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(メンタルヘルス) 失敗してしまった 高校一年生です。ここ数年間、過去の失敗を思い出して体調不良を起こしています。薬物治 1 2023/01/07 00:37
- 英語 Thirty-one implants (5 in a one-stage and 26 in a 1 2023/04/03 17:01
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 工学 下記のひろゆきの主張をどうみますか? 9 2023/02/20 14:10
- 行政学 絶対に失敗は許されない時に、失敗する人は何が原因だと思いますか? 6 2023/06/10 12:37
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- モテる・モテたい 恋愛が分からない。どうすればいいか分からない 3 2022/12/16 22:22
- アニメ あるアニメを探しています。 1 2022/07/13 21:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLファイルある内に書式につい...
-
正規表現でAND検索はできる...
-
掲示板の認証でエラーが生じて...
-
メールアドレスの正規表現について
-
PS4コントローラーをPCでゲーム...
-
SJISで、全角文字Aの文字コード...
-
Chr(13)とChr(10)の違いは?
-
EBCDIC⇒SJIS変換の方法
-
エクセルでアルファベットか数...
-
Googleスプレッドシートでワイ...
-
400~800字程度といわれれば?
-
パワーポイントで文字の上に線...
-
4Kの外部モニターに出力すると...
-
EXCELで=より左の文字を一括で...
-
wordで均等割り付けをするとき...
-
エクセルでセル内改行の複数行...
-
エクセルで文字列の最大値を抽...
-
VBAでの Replace関数で、ワイル...
-
棒グラフ 横軸の縦書き2列にし...
-
エクセル
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
メールアドレスの正規表現について
-
正規表現でAND検索はできる...
-
第二水準漢字が含まれるか?
-
[VBS] テキストファイルから任...
-
正規表現でシングルクォーテー...
-
正規表現でカウントアップ(?)す...
-
VB2005で、正規表現を使いたい
-
正規表現です。括弧内にある複...
-
文章中全ての半角カッコ ( の...
-
文字列検索(grepのようなもの)...
-
grepの正規表現での最短マッチ...
-
sedで正規表現の後方参照を使い...
-
XMLファイルある内に書式につい...
-
perl でこのマッチは失敗します...
-
VB.NET で正規表現を使用した検...
-
正規表現で大文字小文字指定に...
-
grepにマッチした正規表現の文...
-
正規表現で( , -, ] を表すと。
-
正規表現の逆?
おすすめ情報