- 締切済み
正規表現のことで
ある本に正規表現の例として、以下のように記載されていました。 「A*C」の時は「AAAC」「AC」「C」など 最後の「C」は間違いのよう思えるのですが。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- gaktank
- ベストアンサー率65% (23/35)
>正規表現と、ワイルドカードを混同 混同してしまっていました。失礼しました。 #5さんの回答の通りです。
- ysk6406
- ベストアンサー率40% (237/589)
パターン A*C は、C にもマッチします。 No.3 の回答は、誤りです。 ちょっと実験してみれば、すぐにわかることです。 以下のサンプルプログラムを実行してみて下さい。 $_ = "C"; if (/A*C/) { print "Matched.\n"; } 私の環境(ActivePerl 5.8.4)では、Matched. と表示されます。
- xjd
- ベストアンサー率63% (1021/1612)
Linuxなどの環境があるなら、実際にやってみましょう。 $ cat data AAAC AC A C $ egrep 'A*C' data AAAC AC C 正規表現 A*C は C とマッチします。
- FoggyMountain
- ベストアンサー率21% (79/372)
正規表現と、ワイルドカードを混同してしまっている人がいますね。
- gaktank
- ベストアンサー率65% (23/35)
jesuiさんのご指摘のとおり、「A*C」ではマッチしません。 「[A]*C」であればCもマッチします。 本に書いてあることでも、誤植や著者の思い込み等で間違っていることも多少ありますので、本は参考程度にして自分の目で確かめてみるのが一番だと思います。
- JUN-2
- ベストアンサー率26% (360/1349)
*は0文字にもマッチしてしまいますので、あっています。 なお、+は1文字以上になります。 メタ文字の違いを復習してみてください。
- xjd
- ベストアンサー率63% (1021/1612)
*の前の文字の「0回以上」の繰り返し、という意味なので、 正規表現A*Cは、Cの一文字と一致します。 本をもう一度読み直してみては?
お礼
私もワイルドカードのことが頭にあったものですから、理解しがたかったんだと思います。が、これはある意味当然のことだと思います。 本を読み直しましょうとか復習しましょうとか言われている人もいますが、大抵の本は、「前の文字の0回以上の繰り返し」という説明のみで、そこだけを何度読み直したって、「C」が該当するとは理解しかねると思います。 ワイルドカードの知識が下地にある人間は、「A*C」に関しては、「A」が残った上で、「*」に関してが、「前の文字の0回以上の繰り返し」に当てはまると理解するのが自然でしょう。 ですから、前の文字のゼロ回の繰り返しの時は、「A」はそのままで、「*」がゼロになり、「AC」になる。これが、ワイルドカードの知識のある人間の自然な考え方だと思います。 私が今後、私と同様の間違った認識を持っている人に教えることがあったなら、「前の文字のゼロ回以上の繰り返し」は、「*」単独のことを説明しているのではないので、「A*」をセットで考えるようにと教えます。これなら、即、なるほどと思えるでしょう。 本を読み直すことが無意味であることは一目瞭然ですから、そんな無意味なアドバイスは決してしないでしょう(笑)