みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

秀丸の検索・置換の正規表現の最短一致の挙動が変です

秀丸の検索または置換の正規表現の
最短一致での挙動ですが、

/abc/def/ghi/jkl/mno/pqr/st/uvw.xyz
の先頭にカーソルを置いた状態で、

(質問1)
正規表現のチェックボックスをチェックして
/.*$
で検索すると
/abc/def/ghi/jkl/mno/pqr/st/uvw.xyz
が検索されると思うのですが
実際には
/def/ghi/jkl/mno/pqr/st/uvw.xyz
が検索されてしまいます。
なぜでしょうか。
(/abc/.*$とするとカーソルがある
/abc/def/ghi/jkl/mno/pqr/st/uvw.xyz
ではなく次の行以降の
/abc/def/ghi/jkl/mno/pqr/st/uvw.xyz
が検索されてしまいます?)

(質問2)
正規表現のチェックボックスをチェックして
/.*?$
で検索すると最短一致となるため
/uvw.xyz
が検索されると思うのですが
実際には
/def/ghi/jkl/mno/pqr/st/uvw.xyz
が検索されてしまいます。
なぜでしょうか。
(なお、/[^/]*$では/uvw.xyzが検索されます)

投稿日時 - 2017-09-11 11:30:07

QNo.9373362

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>ものぐさ指定をした場合は、逆に、もっとも短い文字列に
>ヒットしようとします。と説明されています。

「ものぐさ指定」が有効なのは、正規表現のDLLにHmJre.dllを指定している場合のみです。DLLに「HmJre.dll」が指定されている事を確認して下さい。

他のDLLが指定されている場合「?」は「*」と同様の意味のメタ文字になり「ものぐさ指定」にはなりません(「/.*?$」と書いても「/.**$」と同じ意味になります)

投稿日時 - 2017-09-11 14:51:20

補足

追記

ところで、(質問2)の実行結果ですが、
そちらでは、
/def/ghi/jkl/mno/pqr/st/uvw.xyz
ではなく
/uvw.xyz
が検索されているのでしょうか。

もし、そうであれば、
秀丸とHMJRE.DLLのバージョンと、
念のため、白紙の状態の秀丸で、
実行した時のマクロ記録をいただけないでしょうか。


回答例:
秀丸(Ver.8.73)
HMJRE.DLL(V5.00)
---test.mac--------------------------
setcompatiblemode 0x0F;
insert "/abc/def/ghi/jkl/mno/pqr/st/uvw.xyz";
insertreturn;
up;
searchdown "/.*?$" , regular, nocasesense, nohilight;
-------------------------------------

よろしくお願いします。

投稿日時 - 2017-09-27 16:38:16

お礼

>DLLに「HmJre.dll」が指定されている事を確認して下さい。

確認しました。HMJRE.DLLになっていました。
念のため、最新の秀丸(Ver.8.73)をインストールしてみました。
秀丸をインストールするとデフォルトで
HMJRE.DLLが設定されていました。
HMJRE.DLL V5.00です。
これで同じことを確認してみましたが、同様の結果になります。
よろしくお願いします。

投稿日時 - 2017-09-12 15:20:49

ANo.1

>(質問1)

秀丸の文字列検索は「キャレット(カーソル)がある位置の1文字先から検索を開始」します。

じゃないと「同じ条件で次を検索」が出来なくなってしまいます。

もし、キャレットの現在位置からを検索対象にすると「次を検索」をしても「現在位置の文字列がヒットしてしまって、キャレットが次に進まない状態」になって「次を検索」できなくなってしまいます。

なので「キャレットの現在位置の次の文字」つまり「a」の文字から検索を開始し、最初にヒットする「cの次、dの前の/」つまり

/def/ghi/jkl/mno/pqr/st/uvw.xyz

が検索されます。

>(質問2)

秀丸の正規表現は「最長一致」が原則です。

質問1の回答にある通り「キャレット(カーソル)の次の文字から検索を開始」し、しかも「最も長い文字列に一致する」ので

/def/ghi/jkl/mno/pqr/st/uvw.xyz

が検索されます。

投稿日時 - 2017-09-11 11:49:39

お礼

回答ありがとうございます。

(質問1)は理解しました。
(質問2)ですが、秀丸でも、*は最長一致ですが、
*?とすると最短一致(ものぐさ)になるのではないでしょうか。
秀丸のヘルプの
「*?・+?・??・{n,m}? 繰り返しマッチングでのものぐさ指定 」
に、「*」、「+」、「?」、「{n,m}」のような繰り返し指定は、
原則として、もっとも長い文字列にマッチさせるように動作しますが、
ものぐさ指定をした場合は、逆に、もっとも短い文字列に
ヒットしようとします。と説明されています。

よろしくお願いします。

投稿日時 - 2017-09-11 13:31:19

あなたにオススメの質問