正規表現の中で変数を使うには?

[上に] [前に] [次に]
ミワ [E-Mail] 2000/06/07(水) 17:09:22
早速質問ですが、正規表現の中で

 if ( $data[8] =~ /$keyword[0]/ ) { 〜 ; } とか
 if ( $data[8] =~ /フォーム/ ) { 〜 ; }

としたらエラーが出てしまいました。

正規表現がいまいち理解できていないので、
間違っているのはなんとなく分かるんですが、どう間違っているのか
が分からないんです。
お分かりになる方、ご教授お願いいたします。

バギンズ 2000/06/07(水) 17:51:34
>if ( $data[8] =~ /$keyword[0]/ ) { 〜 ; }
の方は特に問題ない気がします。

>if ( $data[8] =~ /フォーム/ ) { 〜 ; }
は、Shift-JISだと ー の2バイト目が [ と同じコードになります。
Shift-JISの場合は直接正規表現中に全角文字を入れると、いろいろ
問題が生じますので、一旦変数に代入してから使ったほうがいいかと
思います。

$frm = 'フォーム' ;
if ( $data[8] =~ /$frm/ ) { 〜 ; }

さくらいゆずる 2000/06/07(水) 17:56:42
んと、別に変数が悪いわけじゃないです(多分)。
文字コードがSJISの場合、マッチングするときにエラーを起こす文字っていうのが
存在するそうなので、そのせいです。

if ( $data[8] =~ /フォーム/ ) { 〜 ; }
については「ー」のせいです。

参考:
http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/faq/faq2.html#c4
http://www1.mirai.ne.jp/~mikeneko/bd/log.cgi?room=510

さくらいゆずる 2000/06/07(水) 18:02:42
見事にかぶってますね・・・。

>$frm = 'フォーム' ;
>if ( $data[8] =~ /$frm/ ) { 〜 ; }
これでも、「ー」に対してマッチングをするというのは同じなので、だめなのでは?

ミワ [E-Mail] 2000/06/07(水) 18:14:46
バギンズさん、さくらいゆずるさんありがとうございます。

>$frm = 'フォーム' ;
>if ( $data[8] =~ /$frm/ ) { 〜 ; }
>これでも、「ー」に対してマッチングをするというのは同じなので、だめなのでは?

変数に「ー」が入っていたのでエラーになっていました。
リンクの場所を読ませていただいてEUCにすれば良さそうな感じなのは分かったのですが
この場合 $data[8] と $frm をEUCにしなければいけないのでしょうか?
$frmだけをEUCにするだけでいいんでしょうか??

バギンズ 2000/06/07(水) 18:41:59
どうもすいません。(^_^;)

両方EUCに変換ですね。

バギンズ 2000/06/07(水) 18:45:08
あと、正規表現である必要がない場合は、indexで検索する方が
簡単かもしれません。

ねね 2000/06/07(水) 18:48:30

$frm = 'フォーム' ;
$frm = quotemeta($frm);
if ( $data[8] =~ /$frm/ ) { 〜 ; }

ミワ [E-Mail] 2000/06/07(水) 18:56:53
[[解決]]
バギンズさん、度々ご回答ありがとうございます。

とくに正規表現やる必要もなかったので、
if ( index $data[8],$frm ) {...
で、問題なく動きました。

まだperlは初心者ですが、やれることが増えてくると楽しいですね。
ありがとうございました!

ミワ 2000/06/07(水) 19:00:44
ねねさんありがとうございます。

>$frm = 'フォーム' ;
>$frm = quotemeta($frm);
>if ( $data[8] =~ /$frm/ ) { 〜 ; }

こっちもためしてみます。

バギンズ 2000/06/08(木) 01:48:18
>quotemeta
なるほど、Perl5だと色々便利なんですねー。
まったく勉強不足でした。(^_^;)

sadahiro 2000/06/08(木) 03:19:02
$data[8] =~/\Qフォーム/;
もいいでしょう。quotemetaの代わりになります。
というより\Qを実装するための内部的な関数がquotemetaだとか。
/\Q日本語\E$pattern/ とかも。

sadahito 2000/06/08(木) 05:05:46
解決でていますが、もう少しだけ
>/\Q日本語\E$pattern/ とかも。
は\Q\Eで囲む意味がありませんでした。済みません。
\Eは\Qと\Lと\Uの効果を打ち消すものですが、
/\Qフォーム\E$pattern/  のような場合ですね。
しかし /\Q表示\E/ はうまくありませんね
(マッチ演算子//の中の \ はエスケープされない)。
ですから一般的に日本語のマッチではおすすめできません。

ねねさん(2000/06/07(水) 18:48:30)の方式がよろしいかと思います。

しかし quotemeta($a) の代わりに "\Q$a\E" を使う
($aの内容に \ が含まれても可)のは等価なのでいいのですが、
まあ、余計なことを持ち出したようでした。

S-pore [HomePage] 2000/06/08(木) 09:51:26
> $frm = quotemeta($frm);
> なるほど、Perl5だと色々便利なんですねー。

Perl4 なら,
$frm =~ s/[^\w]/\\$&/g;
で代用できるかな。

バギンズ 2000/06/08(木) 10:23:52
>$data[8] =~/\Qフォーム/
>/\Q日本語\E$pattern/
>\Eは\Qと\Lと\Uの効果を打ち消すもの
なるほど、そーいうのもあったんですか...

>Perl4 なら,
>$frm =~ s/[^\w]/\\$&/g;
うっすぐに理解できない...(^_^;)

勉強させていただきます。m(_ _)m

バギンズ 2000/06/08(木) 10:29:00
勉強してきました。quotemetaと全く同じ意味でしたか。(^_^;)
>$frm =~ s/[^\w]/\\$&/g;
$frm =~ s/[\W]/\\$&/g;
でもいいんですね。

S-pore [HomePage] 2000/06/08(木) 11:34:58
> $frm =~ s/[\W]/\\$&/g;
> でもいいんですね。

$frm =~ s/\W/\\$&/g;
でもOKですね。
前のを書き込んだ直後に \W に気付きました。(^^;

[上に] [前に] [次に]