- 締切済み
秀丸の検索・置換の正規表現の最短一致の挙動が変です
秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /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が検索されます)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8798/19954)
>ものぐさ指定をした場合は、逆に、もっとも短い文字列に >ヒットしようとします。と説明されています。 「ものぐさ指定」が有効なのは、正規表現のDLLにHmJre.dllを指定している場合のみです。DLLに「HmJre.dll」が指定されている事を確認して下さい。 他のDLLが指定されている場合「?」は「*」と同様の意味のメタ文字になり「ものぐさ指定」にはなりません(「/.*?$」と書いても「/.**$」と同じ意味になります)
- chie65536(@chie65535)
- ベストアンサー率44% (8798/19954)
>(質問1) 秀丸の文字列検索は「キャレット(カーソル)がある位置の1文字先から検索を開始」します。 じゃないと「同じ条件で次を検索」が出来なくなってしまいます。 もし、キャレットの現在位置からを検索対象にすると「次を検索」をしても「現在位置の文字列がヒットしてしまって、キャレットが次に進まない状態」になって「次を検索」できなくなってしまいます。 なので「キャレットの現在位置の次の文字」つまり「a」の文字から検索を開始し、最初にヒットする「cの次、dの前の/」つまり /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されます。 >(質問2) 秀丸の正規表現は「最長一致」が原則です。 質問1の回答にある通り「キャレット(カーソル)の次の文字から検索を開始」し、しかも「最も長い文字列に一致する」ので /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されます。
お礼
回答ありがとうございます。 (質問1)は理解しました。 (質問2)ですが、秀丸でも、*は最長一致ですが、 *?とすると最短一致(ものぐさ)になるのではないでしょうか。 秀丸のヘルプの 「*?・+?・??・{n,m}? 繰り返しマッチングでのものぐさ指定 」 に、「*」、「+」、「?」、「{n,m}」のような繰り返し指定は、 原則として、もっとも長い文字列にマッチさせるように動作しますが、 ものぐさ指定をした場合は、逆に、もっとも短い文字列に ヒットしようとします。と説明されています。 よろしくお願いします。
お礼
>DLLに「HmJre.dll」が指定されている事を確認して下さい。 確認しました。HMJRE.DLLになっていました。 念のため、最新の秀丸(Ver.8.73)をインストールしてみました。 秀丸をインストールするとデフォルトで HMJRE.DLLが設定されていました。 HMJRE.DLL V5.00です。 これで同じことを確認してみましたが、同様の結果になります。 よろしくお願いします。
補足
追記 ところで、(質問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; ------------------------------------- よろしくお願いします。