t が欲張りマッチ?

投稿者: kgoto3 声7 投稿

たとえば以下のようなテキストがあり、 1 hogefuga1 hogefuga2 hogefuga3 2 hogefuga1 hogefuga2 hogefuga3 3 hogefuga1 hogefuga2 hogefuga3 行頭の何らかの文字列とその後に続くタブを削除したい場合、以前は以下の正規表現で可能でした。 ^.*?t これを現行の Version 12.0.11 で実行すると、以下の結果となります。 hogefuga3 hogefuga3 hogefuga3 t が欲張りマッチとなっているような挙動です。 以前のバージョンでは以下のようになったはずです。 hogefuga1 hogefuga2 hogefuga3 hogefuga1 hogefuga2 hogefuga3 hogefuga1 hogefuga2 hogefuga3 代替手段としては、^.*?t(.*) でマッチさせて置換後の文字列を 1 で解決できますが、^.*?t でマッチさせて削除するほうが直感的で楽です。 以前の挙動に戻していただくことはできますでしょうか。 よろしくお願いいたします。
欲張りマッチになっているわけではなく,まず「1t」を空文字列に置換したあと,「hogefuga1」の先頭から次の探索を始めるのですが,その際に「hogefuga1」の左端を行頭とみなして,「hogefuga1t」を空文字列に置換してしまう,その繰り返しなのだと思います。 最初の置換のあと,新たに〈行頭〉になってしまった箇所を行頭とみなすかどうかは,ツールによって違うようですね。 どちらが正解ということはないと思います。 たぶん,プログラミング言語や正規表現ライブラリー自体の動作は,これを行頭とみなさないほうが普通ではないかと思います。 テキストエディターではこれを行頭とみなすものも少なくない気がします。 しかし,ちょっと調べたところ,EmEditor の現在の動作は確かに不可解なところがあります。 こんな実験をしてみましょう。 「A3A3A3」というテキストを用意します。 ・「^A3」を空文字列に置換すると「A3A3」になります。 ・「^.3」を空文字列に置換すると「A3A3」になります。 ・「^A.」を空文字列に置換すると「A3A3」になります。 ・「^..」を空文字列に置換すると「A3A3」になります。 ・「^Ad」を空文字列に置換すると空文字列になります。 ・「^w3」を空文字列に置換すると空文字列になります。 ・「^wd」を空文字列に置換すると空文字列になります。 どうも,検索パターンに「」が含まれているか否かで動作が違っているのではないか,という気がします。 さらに調べを進めたところ,[ツール]→[カスタマイズ]→[検索]で,「正規表現が改行に一致することができる」を ON にしたときは上記のいずれの場合も空文字列になりました。 理由のあることなのかも知れませんが,ユーザーにとっては混乱の元なので,現状の仕様は望ましくないと思います。
kgoto 様 いつも EmEditor Professional をお使いいただき、誠にありがとうございます。 ご報告ありがとうございます。 以前のバージョンでも、「正規表現が改行に一致することができる」がオンになっていれば、v12 と同じ動作になっていました。 ところが、v12.0.8 のリリースのお知らせにあるように、 - 正規表現を使用する複数行検索に関する特定の問題を修正しました。 https://emeditorjp.wpengine.com/modules/newbb/viewtopic.php?topic_id=1965&forum=5 に対応するため、仕様が変わりました。つまり、正規表現に [、、( が含まれているか、または [正規表現が改行文字に一致することができる] がチェックされている場合に、複数行から置換を行うように仕様変更しています。複数行から置換を行う場合には、検索と置換を繰り返し行うようになっているため、上記の例だと、検索開始位置が、常に行頭になってしまいます。複数行から置換を行わない場合、行単位での置換を行うための最適化が行われるため、このような問題がなくなります。 この点についてですが、複数行からの検索でも、問題がないように改良を検討させていただきます。 また、複数行の検索の判定を元に戻すことも検討いたします。 よろしくお願い申し上げます。
こんにちは redakt55 さん 挙げていただいた実験例を試してみました。 私の環境でも同じ結果となりました。
江村 様 ご返答ありがとうございます。 改良の報告を期待して待っています! よろしくお願いいたします。
kgoto 様、redakt55 様 いつも EmEditor Professional をお使いいただき、誠にありがとうございます。 ベータ 11 (v12.9.11) にて、複数行からの検索の場合でも、問題がないように修正いたしました。 また、複数行から検索する条件を、v12.0.8 以前の条件に戻しました。複数行からの検索は、1行ずつの検索に比べ、速度が遅くなるためというのもあります。 しかし、これが問題になる場合には、以下のようにレジストリに値を追加することで v12.0.8 の動作になります。 レジストリ HKEY_CURRENT_USERSoftwareEmSoftEmEditor v3Common に RegexMultilineStrict (REG_DWORD) 0、または存在しない場合: 検索文字列または置換文字列に n または n が含まれている場合、複数行検索となります。 1 の場合: 上記に加えて、検索または置換文字列に r、 が含まれている場合、または 検索文字列に [ または ( が含まれている場合、複数行検索となります。 なお、「正規表現が改行に一致することができる」がチェックされている場合は、常に複数行検索となります。 よろしくお願い申し上げます。
早速のご対応ありがとうございます!

このトピックの投稿: 7