7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • 投稿者
    投稿
  • #11696

    kgoto
    メンバー

    たとえば以下のようなテキストがあり、

    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 でマッチさせて削除するほうが直感的で楽です。

    以前の挙動に戻していただくことはできますでしょうか。

    よろしくお願いいたします。

    #11697

    redakt55
    Participant

    欲張りマッチになっているわけではなく,まず「1t」を空文字列に置換したあと,「hogefuga1」の先頭から次の探索を始めるのですが,その際に「hogefuga1」の左端を行頭とみなして,「hogefuga1t」を空文字列に置換してしまう,その繰り返しなのだと思います。

    最初の置換のあと,新たに〈行頭〉になってしまった箇所を行頭とみなすかどうかは,ツールによって違うようですね。
    どちらが正解ということはないと思います。
    たぶん,プログラミング言語や正規表現ライブラリー自体の動作は,これを行頭とみなさないほうが普通ではないかと思います。
    テキストエディターではこれを行頭とみなすものも少なくない気がします。

    しかし,ちょっと調べたところ,EmEditor の現在の動作は確かに不可解なところがあります。
    こんな実験をしてみましょう。
    「A3A3A3」というテキストを用意します。
    ・「^A3」を空文字列に置換すると「A3A3」になります。
    ・「^.3」を空文字列に置換すると「A3A3」になります。
    ・「^A.」を空文字列に置換すると「A3A3」になります。
    ・「^..」を空文字列に置換すると「A3A3」になります。
    ・「^Ad」を空文字列に置換すると空文字列になります。
    ・「^w3」を空文字列に置換すると空文字列になります。
    ・「^wd」を空文字列に置換すると空文字列になります。
    どうも,検索パターンに「」が含まれているか否かで動作が違っているのではないか,という気がします。

    さらに調べを進めたところ,[ツール]→[カスタマイズ]→[検索]で,「正規表現が改行に一致することができる」を ON にしたときは上記のいずれの場合も空文字列になりました。

    理由のあることなのかも知れませんが,ユーザーにとっては混乱の元なので,現状の仕様は望ましくないと思います。

    #11698

    Yutaka Emura
    Keymaster

    kgoto 様

    いつも EmEditor Professional をお使いいただき、誠にありがとうございます。

    ご報告ありがとうございます。

    以前のバージョンでも、「正規表現が改行に一致することができる」がオンになっていれば、v12 と同じ動作になっていました。

    ところが、v12.0.8 のリリースのお知らせにあるように、

    – 正規表現を使用する複数行検索に関する特定の問題を修正しました。
    http://jp.emeditor.com/modules/newbb/viewtopic.php?topic_id=1965&forum=5

    に対応するため、仕様が変わりました。つまり、正規表現に [、、( が含まれているか、または [正規表現が改行文字に一致することができる] がチェックされている場合に、複数行から置換を行うように仕様変更しています。複数行から置換を行う場合には、検索と置換を繰り返し行うようになっているため、上記の例だと、検索開始位置が、常に行頭になってしまいます。複数行から置換を行わない場合、行単位での置換を行うための最適化が行われるため、このような問題がなくなります。

    この点についてですが、複数行からの検索でも、問題がないように改良を検討させていただきます。
    また、複数行の検索の判定を元に戻すことも検討いたします。

    よろしくお願い申し上げます。

    #11699

    kgoto
    メンバー

    こんにちは redakt55 さん

    挙げていただいた実験例を試してみました。
    私の環境でも同じ結果となりました。

    #11700

    kgoto
    メンバー

    江村 様

    ご返答ありがとうございます。
    改良の報告を期待して待っています!

    よろしくお願いいたします。

    #11705

    Yutaka Emura
    Keymaster

    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、 が含まれている場合、または 検索文字列に [ または ( が含まれている場合、複数行検索となります。

    なお、「正規表現が改行に一致することができる」がチェックされている場合は、常に複数行検索となります。

    よろしくお願い申し上げます。

    #11706

    kgoto
    メンバー

    早速のご対応ありがとうございます!

7件の投稿を表示中 - 1 - 7件目 (全7件中)

このトピックに返信するにはログインが必要です。

友達に知らせる... Tweet about this on TwitterShare on FacebookShare on Google+Email this to someone