重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

秀丸の正規表現
http://pc.dearie.jp/hidemaru/replace/14.html

上記URLでメールの正規表現について解説があります。

[A-Za-z0-9\-\.\_]+@[A-Za-z0-9\-\_]+\.[A-Za-z0-9\-\.\_]+
この正規表現でメールの検索をおこなっています。この正規表現は理解出来ます。

.*([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+)([^a-z0-9@\.\-\_]+).*
キャプチャを使って正規表現でメールアドレスをマッチしているのは理解できます。
なぜ置換で、「\1,」とやっても、メールアドレスのみを取得できないのでしょうか?

実際に秀丸エディタを使ってやってみましたが、メールアドレスのみ取得することができませんでした。
検索ではメールアドレスにマッチするのに、なんでキャプチャが正しく動かないのかがわかりません・・・

A 回答 (2件)

*とか+等は、複数の候補がある場合、できるだけ長く採用しようとします。


これを、「最長一致」とか「貪欲(greedy)なマッチ」とか言います。
http://www.shuiren.org/chuden/teach/hidemaru/sei …

そのサイトにある
> wa_ta_si01@becky_dearie_jp もしくは wa_ta_si02@becky_dearie_jp よ。

> 2@becky_dearie_jp,
になってしまうのは、最初の.*がなるべく長くなるようにマッチするためで
.* → wa_ta_si01@becky_dearie_jp もしくは wa_ta_si0
([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+) → 2@becky_dearie_jp → \1
となるためです。

最近の秀丸では、「ものぐさ」なマッチが使えます。
http://hide.maruo.co.jp/software/hidemaru7/reg.h …
http://www.shuiren.org/chuden/teach/hidemaru/sei …

.*?([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+)([^a-z0-9@\.\-\_]+).*
とすると
(先頭の).*? → (先頭の空白)
([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+) → wa_ta_si01@becky_dearie_jp → \1
となり、メールアドレスを取り出すことができます。

しかし、今度は、その後につづく表現が
([^a-z0-9@\.\-\_]+) → もしくは
(末尾の).* → wa_ta_si02@becky_dearie_jp よ。
となってしまい、 wa_ta_si02@becky_dearie_jp を抽出することができなくなります。


いろいろと駆使すればできなくは無いでしょうが、とても複雑な表現になります。
それよりは、そのサイトの後半にあるように、処理を分けた方が簡単でしょう。

※ なお、そのサイトも例をそのままここに書くと、メールアドレスだと判定されてしまうので、変更しています。
    • good
    • 0
この回答へのお礼

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!

お礼日時:2013/02/06 10:37

元々メールアドレスの記載がない行は、検索にヒットしていません


検索にヒットしていなければ、当然置換はできませんよね
置換は、検索にヒットした部分に関して置き換えをするのですから

([^a-z0-9@\.\-\_]+)
が付いているので、直前の改行はヒットして、削除されているのですが
    • good
    • 0
この回答へのお礼

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!

お礼日時:2013/02/06 10:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!