• 締切済み

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

秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /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が検索されます)

みんなの回答

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.2

>ものぐさ指定をした場合は、逆に、もっとも短い文字列に >ヒットしようとします。と説明されています。 「ものぐさ指定」が有効なのは、正規表現のDLLにHmJre.dllを指定している場合のみです。DLLに「HmJre.dll」が指定されている事を確認して下さい。 他のDLLが指定されている場合「?」は「*」と同様の意味のメタ文字になり「ものぐさ指定」にはなりません(「/.*?$」と書いても「/.**$」と同じ意味になります)

yam2012
質問者

お礼

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

yam2012
質問者

補足

追記 ところで、(質問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; ------------------------------------- よろしくお願いします。

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.1

>(質問1) 秀丸の文字列検索は「キャレット(カーソル)がある位置の1文字先から検索を開始」します。 じゃないと「同じ条件で次を検索」が出来なくなってしまいます。 もし、キャレットの現在位置からを検索対象にすると「次を検索」をしても「現在位置の文字列がヒットしてしまって、キャレットが次に進まない状態」になって「次を検索」できなくなってしまいます。 なので「キャレットの現在位置の次の文字」つまり「a」の文字から検索を開始し、最初にヒットする「cの次、dの前の/」つまり /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されます。 >(質問2) 秀丸の正規表現は「最長一致」が原則です。 質問1の回答にある通り「キャレット(カーソル)の次の文字から検索を開始」し、しかも「最も長い文字列に一致する」ので /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されます。

yam2012
質問者

お礼

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

関連するQ&A

  • エクセルで,スペースのある文字列を列ごとに分けるには?

    例えば abc def ghi jkl mno pqr という文章があったとします。 それを |abc|def|ghi| ------------- |jkl|mno|pqr| みたく,スペースのあるところで区切るにはどのようにすればよいでしょうか。教えてください。

  • エクセル セルの並べ換え方法について教えて下さい

    縦 A列とB列に入力してある内容を縦一列にまとめて上下二段にする方法、 どなたか教えて下さい! A列   B列 abc def ghi jkl    mno pqr これを A列 abc def ghi jkl mno pqr という様にしたいのです。   

  • 「マッチしない」正規表現の書き方

    正規表現について、おたずねします。 文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。 それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか? あちこち調べましたが、どうしてもわかりません。 ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

  • 複数種類の括弧でくくられてない文字をマッチングさせたい

    Perlの正規表現で質問です。 複数種類の括弧、たとえば()、【】、[]などで囲まれていない文字をマッチングさせたいのです。 括弧は1行に複数ある可能性があり、ない場合もあります。 (abc)【def】ghi【jkl】 だとghiの部分。 【abc】【def】(ghi)jkl(mno) だとjklです。 頭に必ず括弧が来たり、括弧が一回だけなら括弧閉じるの種類をor検索ではじけるのですが、何回くるかわからないのでどうしたらいいか困っています。 方法がありましたら教えてください。

    • ベストアンサー
    • Perl
  • CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

    CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

  • 加工バッチ

    加工バッチの件で質問させて頂きます。 テキストログファイルの文字列をバッチで加工したい。 テキストファイルの文字列にはコロン(:)、スペース( )、 セミコロン(;)を区切り文字として使用していますが、 それをバッチで全てスペースで区切りしたいのですが可能でしょうか。 例えば ABC DEF GHI JKL: MNO;PQR;STU;VWXYZ バッチ起動後--------> ABC DEF GHI JKL MNO PQR STU VWXYZ よろしくお願いします。

  • 一括置換をしたい

    ワード2003を使っています。 あるテキストデータの 「ABC」という文字列を「DEF」に置換したいんです。 同様に、 「GHI」を「JKL」に、 「MNO」を「PQR」に置換したいんです。 このように3つの文字列をボタンひとつで置換するにはどのようにすれば良いでしょうか? よろしくお願い致します。

  • サクラエディタの正規表現での置換

    サクラエディタの正規表現での置換の方法について教えて下さい。 行の末尾が数字で終わらない行の改行コードを削除したいと考えています。 ---------- 元ファイル ---------- 000abc123 777def 456 333ghi789 222jk+ 111 ---------- ---------- 加工後 ---------- 000abc123 777def456 333ghi789 222jk+111 ---------- 「置換前」は『[^0-9]\n』を入力することで検索できましたが、 「置換後」に何を設定すれば良いのかわかりません。(または「検索対象」の設定を変える必要があるのかなど) 例えば置換後に何も設定しないと「777de456」とfが消えてしまうため、”f”を残した上で改行コードを削除したいのですが その方法がわかりません。 よろしくお願いいたします。

  • テキストデータ(文字)のブロック移動

    説明しにくいのですが 例えば、下のような データがあるとします。 データ1 001 002 003 004 005 006 007 008 データ2 ABC DEF GHI JKL MNO PQR STU VWX この二つのデータを 001ABC 002DEF 003GHI 004JKL 005MNO 006PQR 007STU 008VWX のように、横にひっつける事は メモ帳では容易にできませんが メモ帳程度で(上がっててもあまり メモリやリソースを食わない もので、機能もごてごてしていなくて でも一太郎のように、ブロックで囲み 移動、複写、など簡単に行える フリーソフトなどないでしょうか? エクセルの機能を使って、ひっつけたり しているのですが、なにぶん面倒で、 ワードでも無理みたいな感じですし しかも、メモリをたくさん使うし 一太郎は入ってないですし、入れたくもないし・・・ ワードでも無理みたいな感じですし そのままTXTとして保存できないし・・・・ 心当たりをご存じの方おねがいします。

  • シュワルツ変換の不具合

    シュワルツ変換の不具合で困っています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1959574 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 で質問したものです。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; &hoge; sub hoge{ open(o,"hoge.txt"); @all = <o>; close(o); for (@all){ ($sentence,$filename) = split(/,/,$_); $score++; push @hoge, ($score,$_,"<br>\n"); } @hoge = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /,/]}@hoge; print @hoge; } というcgiを作成し、実行してみたのですが望んだ処理が出来ません。 hoge.txtは ,123,abc.txt ,456,def.txt ,789,ghi.txt ,123,jkl.txt ,456,mno.txt ,789,pqr.txt という内容です。 cgiを実行すると 6 5 4 3 2 1 ,789,pqr.txt ,456,mno.txt ,123,jkl.txt ,789,ghi.txt ,456,def.txt ,123,abc.txt となってしまいスコアが先頭に集まってしまいます。 シュワルツ変換の行を削除すると 6,789,pqr.txt 5,456,mno.txt 4,123,jkl.txt 3,789,ghi.txt 2,456,def.txt 1,123,abc.txt こうなるのですが、これをシュワルツ変換を用いて 1,123,abc.txt 2,456,def.txt 3,789,ghi.txt 4,123,jkl.txt 5,456,mno.txt 6,789,pqr.txt と出力させたいのです。 どこをどのように変えればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう