以前、正規表現の仕様についてご質問を頂いたので調査していると、少し気になる点が出てきたので修正してみた。と言っても仕様変更というほど大したことではないのだけれど。
ABCDEFGHIJKLMNOPQRSTUVWXYZ
という文字列に対して、正規表現の検索条件が下記。
....
Mery の場合
一度目の検索で
ABCDEFGHIJKLMNOPQRSTUVWXYZ
こうなる。赤文字が選択範囲、緑背景が強調表示なんだけど、もう一度次を検索すると
ABCDEFGHIJKLMNOPQRSTUVWXYZ
こうなる。
サク○エディターの場合
一度目の検索で
ABCDEFGHIJKLMNOPQRSTUVWXYZ
こうなる。行末の 2 文字が強調表示されていない。もう一度検索してみると
ABCDEFGHIJKLMNOPQRSTUVWXYZ
なるほど。現在の選択範囲の次から検索が始まり、強調表示もそれに従っているのか。これはこれで正解だと思う。しかし正規表現的にはヒットしているのに検索されないというのが少し気になる。
秀○の場合
一度目の検索で
ABCDEFGHIJKLMNOPQRSTUVWXYZ
こうなる。先頭の A が選択されない上に、行末の 2 文字が強調表示されていない。もう一度検索してみると
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ん?選択範囲は一応 1 文字ずつ進んでいくようだ。ということは選択範囲と強調表示が一致しない場合が出てくるわけで、これもまた少し気になる。
考察
これらを踏まえて、Mery のように 1 文字ずつ次を検索する方式、サク○エディターのようにマッチした文字列から次を検索する方式、それ以外、で分類してみると下記の通りである。
- 1 文字ずつ次を検索する方式
-
- Mery
- K○Editor
- 真魚
- 秀○ (選択範囲のみ)
- E○Editor (選択範囲のみ)
- Microsoft Visual C++ 2008
- Microsoft Office Word 2007
- ワードパッド *
- マッチした文字列から次を検索する方式
-
- サク○エディター
- TeraP○d *
- N○Editor
- Sublime Text 2
- 秀○ (強調表示のみ)
- E○Editor (強調表示のみ)
- gP○d
- 萌ディタ
- Aptana Studio 3
- 「次を検索」はマッチした文字列から次を検索するが、「前を検索」は 1 文字ずつ前を検索する方式
-
- メモ帳 *
- Notepad++
- Embarcadero RAD Studio XE
* 正規表現で検索する機能が無いものは「AAAAAAAA....」という文字列に対して「AAAA」で検索
* 国産のテキストエディターは伏字 (怒られたら怖いので)
問題
結局どれも間違いではないと思うんだけど、やはり某エディターや某エディターのように検索結果が選択範囲と強調表示で異なるというのはちょっと頂けない。不具合なのかな…?とまで思ってしまったからな。世の中的にはマッチした文字列から次を検索する方式が多数のような気がしなくもないけれど、Mery は Windows 標準っぽい挙動をうたっているので、ある程度 Microsoft 系に準じていると言えばそれが建前になるので現状通りで良いんじゃないかなと思う。いずれにせよ、Mery のエンジンである TNotePad の仕様はこのあたりも考慮した上で現在の仕様になっているようだ。
問題は「前を検索」にあった。Mery は先ほどの条件で次を検索すると 1 文字ずつ次を検索する方式なんだけど「前を検索」ではなぜか 4 文字ずつ戻っていく。まったく意味不明な挙動だが、いつからこんなことになってしまっていたのだろうか。
調べてみると開発着手当時のバージョン (鬼車 5.5.2) ではきちんと 1 文字ずつ戻っているが、鬼車を新しいものに差し替えると 4 文字ずつ戻るようになった。いつの間にか鬼車の仕様が変わったのか?
次を検索と前を検索で検索結果が異なるということは、次を検索で進んでいって「あ、行き過ぎた、戻ろう!」と思ったときに前を検索で戻ることができないケースが出てくるわけで非常に好ましくない挙動である。
Windows 標準のメモ帳などは次を検索と前を検索で結果が異なるというまさにこの不思議な仕様だったわけだが…
更新履歴
- ファイルを開いた直後に範囲選択すると先頭から選択されてしまう不具合を修正
- 正規表現で前を検索した場合の挙動を修正
- VBScript で Option Explicit が動作しなかったのを修正
ダウンロード
* Windows 8, 7, Vista, XP 対応
* Security Essentials (ウイルス対策の定義: 1.169.1871.0) でウイルスチェック済
余談
Mery の正規表現は鬼車を使わさせて頂いているが、Ruby でも採用されている鬼車の改良版、鬼雲に乗り換えようかと検討している。メリットとしては Ruby で使われているので安心感がある、64bit に対応している、機能が少し増える、活発に更新されている、名前がなんだか怖そう、などが挙げられる。
鬼雲の DLL を直接使用する場合はプログラムを修正しなくても DLL を差し替えるだけで行けそうだが、他のテキストエディターでも使われている bregonig.dll を使った方が良いのだろうか?bregonig.dll はライセンスが良く分からないので手を出したくないのだけれど…
自分の場合、検索協調は全置換を実施する際の置換対象を事前確認するのにもよく使います。
Meryでは、提示されている事例では末尾のYZは全置換した場合には残る文字なのに強調表示されるわけですね。
置換対象を確認する目的で利用する場合は、こういうミスマッチに気をつける必要がありますね。
勝手に鬼雲に差し替えて使ってますが全く問題なく動作してます。
bregonig.dllを使うようにするのは反対です。
bregonig.dllの正規表現はPerl準拠であるのに対し、onig.dllはデフォルトでRuby準拠になっていて動作が微妙に異なるので、今まで使えていた正規表現が使えなくなったりします。
秀○の動作は仕様ですよ。ヘルプにもちゃんと明記されています。
「秀○」という表記が良いですねw
正規表現の数学的アナロジーは順序集合かなと、なんとな~く思いますので、一文字ずれる方が私としてはしっくりきます。
● X55 さん
> 置換対象を確認する目的で利用する場合は、こういうミスマッチに気をつける必要がありますね。
おっしゃる通りですね。
今のところは現状維持という方向で行こうと考えておりますので、全置換の際はご注意ください…
● foo さん
ご報告ありがとうございます。
こちらでも鬼雲で動作確認中ですが、一応今のところは普通に動いてますね。
鬼雲独自の機能も使えているようですし。
bregonig.dll に関しては確かにそうですね、Perl 準拠でした。むしろこっちにする方が動作確認が大変っていう話もありますし、そもそも bregexp.dll の代替品として作られているものなので bregexp.dll を使ってないのに bregonig.dll を使うっていうのもどうかと思いますしね。
あら、秀○の動作、ヘルプに載ってましたっけ、、、ちょっと見つけられませんでした。
● saku さん
一文字派にご投票ありがとうございますw
しかしこういった仕様はどれに合わせても使いづらいっていう意見が出てくるものなので、なるべく触れない方が良さそうですね…w
更新お疲れ様です。
(未更新状態が長いと不安に成りますわ)
● ひとみ さん
ありがとうございます。
更新するネタが無いのとやる気が無いだけですね…w
今年はエイプリルフールネタもすっかり忘れていましたし…
Meryでも選択範囲と強調表示される部分が異なるケースが見つかりました。
テストデータ
実際は一行で表示できないほど大量のaの後にbが一文字
aaaaaaaaaaa...aaaaaab
検索パターン
「^a+」 見た目の1行目のaの部分しか強調表示されない
「^a+b$」 どこも強調表示されない
「^a+$」 どこにもマッチしないのに見た目の1行目が強調表示される
特に最後のパターンはまずいような気がする
● foo さん
お久しぶりです、コメントありがとうございます。
うーむ、手厳しい。
> 「^a+」 見た目の1行目のaの部分しか強調表示されない
すみません、としか言いようがないですが、仕様上、強調表示は複数行をまたぐことができません。と言いますのも、正規表現で誤りがあった場合に複数行をまたいで強調表示に行ってしまうと最悪フリーズの恐れがあることを考慮した上での仕様でございます。
それゆえ、「^a+b$」のケースもその仕様上の制限ということになります。
> 「^a+$」 どこにもマッチしないのに見た目の1行目が強調表示される
確かに。。。そんなん考慮しとらんよ、、、と言いたいところですが、確かにそのようですね。うーむ、、、何故だろう。分かりません。うーむ。。。なぜなの!うーむ。。。
> ファイルを開いた直後に範囲選択すると先頭から選択されてしまうのを修正。
ありがとうございます。これからも愛用させていただきますでござる。
すばらしいソフトありがとうございます。
さて、使い方について教えていただきたいのですが、複数のファイルをタブで開いているとき
一つのタブの中で参照したいことがよくありますが、「上下に並べて表示」のボタンの意味がわからず
またボタンを押しても何の変化も現れません、もしこのボタンで非アクティブタブとアクティブタブの
内容を上下に分けて表示できたら便利だと思います、私の設定ミスかもしれませんがよろしくお願いします。
● ek さん
Mery の「上下に並べて表示」機能は,ウィンドウメニューにあるようにウィンドウが対象になっています.
Mery はタブを分離できるので,複数のウィンドウに分離した上で実行してみて下さい.
なお IDE のように同じウィンドウ内で複数のタブの内容を同時に表示することはできません.
● ks さん
いつも的確なサポートありがとうございます。
もはや私より Mery に詳しいのではないかと思ってしまうレベルですw
最近めっきりパソコンを触っておらず、返信が遅れてしまいました申し訳ございません。
● ks さん、ek さん
おっしゃる通り、上下に並べて表示はウィンドウを上下に並べるだけなのでタブが上下に表示されるわけではありません。タブを分離して上下に並べることは可能ですが、あくまで簡易的な見比べ程度にしか使用できないと思います。
恐らく想定されているのは別の内容を並べて表示して見比べる動作だと思いますので、そういった場合は比較ソフトを使用された方がより素早く確実な比較ができます。WinMerge など比較専用ソフトのご使用お勧めします。