|
マクロ作者の皆さん今晩は。別フォーラムにはちょこちょこ登場するCXYZです。
思い立ってマクロの勉強を始めたのですが、正規表現に関して自分ではどうし
てもわからなくなってしまい、皆様のお知恵を拝借したく投稿させていただきま
した。
私は、メール内の広告を検索するマクロ(行く行くはその部分を削除させた
い)を作成し、なんとか動くようなものを作ることができました。それに際し、
広告の上の部分でよく見かける「いろいろな文字列+pr」や「いろいろな文字
列+ad」を検索するため、秀丸Q&Aで正規表現を勉強しました。
そして、まだまだ不十分ではあるものの、以下のような表現を使って、少なく
とも半分以上の確率で、広告の先頭部分にヒットさせています。
^[^/:A-Za-z0-9ぁ-んァ-ヶ〔漢字全て〕]+[(pr)(ad)]+[^/:A-Za-z0-9ぁ-んァ-ヶ
〔漢字全て〕]+
(行頭が英数字・平仮名・片仮名・漢字以外の文字列の繰り返しである。その
後に pr あるいは ad の2文字が1度以上出現する。その後に、再び英数字や漢字
(先ほどと同じ)以外の文字列が1度以上存在する。
そして、この表現の確実さをより高めるため、いろいろな広告を試しました。
しかし、それほどたくさんのパターンを潜り抜ける前に、早速問題が発生しまし
た。マクロが次の文字列を広告と偽ってきたのです。
「 (><)/【ちょっとお知らせ】」
「これは明らかにおかしい。この(正規)表現のどこにそんな文字列を大勝と
する部分があるんだ?」そう思い、何度もQ&Aを見直しました。それから40分ぐ
らい悩んだ末、ようやく結論が出たのです。
答えは以下の1文にありました。
「あ、そうそう。メタキャラクタはキャラクタクラス指定の中では (エスケー
プキャラクタを前に置かなくても自動的に)その特殊な意味を失って、単にその
文字自身を表わすようになります。」
これを読んだ私は、一瞬霧が晴れたような爽快な気分になったのですが、直ぐ
に別の疑問がもやもやと湧いてきました。「それじゃあ、キャラクタクラス指定
の中でグルーピング指定するにはどうしたらいいんだろう…。」
もちろん、考えれば他の方法もあるとは思いますが、とりあえずは
「キャラクタクラス内だからといって、エスケープもしないのに勝手に通常の
文字になってもらっては困る」
のです。何かしら
「キャラクタクラス内でグルーピング先頭を示すための逃げ道」
があるとは思うのですが、それがどうしてもわかりません。もしや、このような
ことはできないのでしょうか。それとも、単なるこちらの見落としでしょうか。
マクロではなく、完全に正規表現だけの質問になってしまいましたが、ご指導
いただければ幸いです。
P.S. 〔漢字全て〕の部分にはJIS範囲外のものも含まれていますが、今回はそ
ちらがメインではなかったので置き換えさせていただきました。(念のため)
|
|