searchdown、正規表現での '*'No.21082
おしょう さん 06/03/20 22:28
 
(一応、該当する記事がないかどうか検索はしたつもりなのですが見つからず、かつ
「マクロ会議室」に問い合わせるべき内容かとも思いつつ、おそらくすごく基本的な
ことなのだろうという気がして、こちらに投稿します。)

マクロの置換で半角の * を含んだ文字列を扱おうとしています。

ところが、「+ * ? の直前に文字がありません」というエラーが出ます。

(問題のないことを確認した部分をカットし、置換を検索に置き直した)コードは、

searchdown "\*", regular;

なのですが、どこで間違っているのかわかりません。(マクロではない通常の検索|
置換ではちゃんとヒットします。)

秀丸 5.15、win XP SP2 です。よろしくお願いします。

[ ]
RE:21082 searchdown、正規表現での '*'No.21083
Iranoan さん 06/03/20 23:10
 
 おしょうさん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> searchdown "\*", regular;
 正規表現で * を表現するには、「\*」とします。おそらくここまでは、既
におしょうさんもご存じの事ともいます。唯ここからマクロのお約束なのです
が、正規表現で「\」がエスケープ・シーケンスであるのと同時に、マクロで
も「\」はエスケープ・シーケンスになっています。その為
searchdown "\\*", regular;
とする必要があります。因みにマクロで正規表現を使って「\」を検索するには、
searchdown "\\\\", regular;
とする必要があります。

[ ]
RE:21083 searchdown、正規表現での '*'No.21085
おしょう さん 06/03/21 18:11
 
Iranoan 様、

ありがとうございました。おかげで解決しました。\\* の話もどこかで見かけて知っ
てはいたのですが、同じマクロ内のエスケープ・シーケンスでも、ダブル・クオー
テーションは
 \" だけでいいのはどう理解したらよいのでしょうか。(\\* も試していたのですが、
そのときはダブル・クオーテーションも \\" としていたために動作しなかったよう
です。)

[ ]
RE:21085 searchdown、正規表現での '*'No.21086
h-tom さん 06/03/21 19:39
 

h-tom です。

>ありがとうございました。おかげで解決しました。\\* の話もどこかで見かけて知っ
>てはいたのですが、同じマクロ内のエスケープ・シーケンスでも、ダブル・クオー
>テーションは
> \" だけでいいのはどう理解したらよいのでしょうか。(\\* も試していたのですが、
>そのときはダブル・クオーテーションも \\" としていたために動作しなかったよう
>です。)
正規表現では " は特殊な意味を持たないので、(正規表現で)エスケープする必要が
ないから。

正規表現で * を検索するには、 \* とする必要がある。(正規表現のエスケープ)
マクロで \* と認識させるには、\\* とする必要がある。(マクロのエスケープ)

正規表現で " を検索するには、 "  でいい。(\"でも問題はない。)
マクロで " と認識させるには、\" とする必要がある。(マクロのエスケープ)

[ ]
RE:21085 searchdown、正規表現での '*'No.21087
Iranoan さん 06/03/21 20:50
 
 おしょうさん今日は、Iranoan です。
> 同じマクロ内のエスケープ・シーケンスでも、ダブル・クオー
> テーションは
>  \" だけでいいのはどう理解したらよいのでしょうか。
 「"」はマクロでは文字列の開始/終了を表します。ですから、「"」の文字
として表現するには、某かのエスケープ・シーケンスが必要になり、そのエス
ケープ・シーケンスが秀丸マクロでは「\」なので、「\"」とします。正規表
現を用いる場合でも、マクロではなくメニューから検索するときに、「\"」と
はせず、「"」としますよね。
 たしかにメニューからも「\"」として「"」を検索できますが、\ でエス
ケープしていても、続く文字 (列) が特別な意味を持たなければ、その文字自
身 (ここでは「"」) を表現するからです。かといってマクロで「\\"」すると
上手くいきません。それは、マクロで読み込んだ時点で、「\\"」は「\"」に
変換され、「"」は文字列の終端として扱われてしまうからです。もしマクロ+
正規表現で「\"」を検索したいなら、まず「\」は二重にエスケープして
「\\\\」とし、「"」は一度エスケープして「\"」とする必要があるので、
「\\\\\"」となります。

 P.S もしまだご質問があれば、「マクロ会議室」に移動しましょう。

[ ]
RE:21086 searchdown、正規表現での '*'No.21088
おしょう さん 06/03/22 08:24
 
h-tom 様、

>正規表現では " は特殊な意味を持たないので

これはうっかり見過ごしていました。いつも機械的にエスケープアウトしていました
から。おかげで納得できました。ありがとうございました。

[ ]
RE:21087 searchdown、正規表現での '*'No.21089
おしょう さん 06/03/22 08:27
 
Iranoan 様、

より詳しい説明、ありがとうございます。

これからはマクロ会議室ものぞくよう心掛けます。(これまではまだ敷居が高かった
のですが、少しずつ見えるようにはなってきたように思います。)

[ ]