1 件の投稿を表示中 (合計 2 個)
  • 作成者
    投稿
  • #31890
    yasuji
    参加者

    江村様

    いつもお世話になっております。
    yasujiです。

    正規表現検索で、使用できる文法がBoost.RegexとOnigmoで一致していない不具合です。Boost.Regexの文法はPerlですが、OnigmoはRubyになって同じ文法を使用することができません。一例としてサブルーティン呼出は、Perlでは(?<a>A)(?&a)、Rubyでは、(?<a>A)(\g<a>)になり、同じ式を利用できずマニュアルにもどこにも情報がありません。

    上記不具合の発生の再現手順は下記の通りです。

    〔対象〕
    v24.3.2 (64bit)

    〔使用環境〕
    OS: Windows 10 Pro 64bit, ver 22H2

    〔再現手順〕
    1.EmEditor 64bit ポータブル版を初期状態で起動
     zipファイルから展開して、起動する。
     初回のエディション選択は、Professionalを選択する。

    2.開いている文書タブに適当なテキストの入力
     例えば、下記のようなテキストを文書タブに入力して未保存状態にする。

    
    "(
    AAAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    )"
    CCCCCCCCCCCC
    DDDDDDDDDDD
    (
    AAAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    )
    "(
    AAAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    )"
    -------
    

    3.検索を開いて、下記の通り設定する
    [検索する文字列]
    (?<a>A)(?&a)

    〔チェックボックス〕
    [一致する文字列を数える(U)]:ON
    上記以外のチェックボックスすべて:OFF
    〔ラジオボタン〕
    [正規表現(X)]:ON

    [高度]
     〔チェックボックス〕
     [CRとLFを区別する(T)]:ON
     [次を検索/前を検索で重ならない文字列のみ一致する(F)]:ON
     上記以外のチェックボックスすべて:OFF
     [正規表現エンジン(G)]:Onigmo
     [正規表現で検索する追加行数(L)]:0

    4.[次を検索]を実行する

    5.結果の確認
    「正規表現には構文エラーが含まれています。」のエラーメッセージボックスが表示されて、実行に失敗する。

    Onigmoは、SyntaxオプションにPerlがあり本来は使用することができるが、できないEmEditor側が関数呼出時に文法を指定せずに呼び出しているため、SyntaxがデフォルトのRubyになってBoost.RegexのデフォルトのPerlと一致して使用できないバグ
    ==>Onigmoの関数仕様を確認しください。プログラム作成者が関数の仕様と、正規表現のSyntaxの種類を全く理解しておらず、Boost.RegexのSyntaxと一致するように実装しなかったことが原因です。

    6.検証
    6.1 検索を開いて、下記の通り設定する
    3.の設定手順のうち、下記の項目のみ変更して、設定する。
    [検索する文字列]
    (?<a>A)(\g<a>)

    6.2 [次を検索]を実行する

    6.3 確認
    正しくAAの文字が選択され、すべてのAAの文字が背景色緑色で強調表示される。

    #31896
    yasuji
    参加者

    申し訳ありません。私の記載ミスで、2.のテキスト、冒頭と3.正規表現が不具合を正確に表せるものになっておりませんでした。
    そのため、正しく説明できる内容に修正しました。
    —————————————————–
    江村様

    いつもお世話になっております。
    yasujiです。

    正規表現検索で、使用できる文法がBoost.RegexとOnigmoで一致していない不具合です。
    Boost.Regexは「Perl」ですが、Onigmoは「Ruby」のため同じ文法を使用することができません。正規表現の文法の違いがわかる一例としてサブルーティン呼出があります。
    Perlでは(?<a>[A-Z])(?&a)、Rubyでは、(?<a>[A-Z])(\g<a>)になり、同じ式を利用できずマニュアルにもどこにも情報がありません。

    上記不具合の発生の再現手順は下記の通りです。

    〔対象〕
    v24.3.2 (64bit)

    〔使用環境〕
    OS: Windows 10 Pro 64bit, ver 22H2

    〔再現手順〕
    1.EmEditor 64bit ポータブル版を初期状態で起動
     zipファイルから展開して、起動する。
     初回のエディション選択は、Professionalを選択する。

    2.開いている文書タブに適当なテキストの入力
     例えば、下記のようなテキストを文書タブに入力して未保存状態にする。

    
    "(
    AAAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    )"
    CCCCCCCCCCCC
    DCDCDCDCDCDCDCD
    (
    AAAAAAAAAAAAAAA
    BABABABABABABA
    )
    "(
    AAAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    )"
    -------
    

    3.検索を開いて、下記の通り設定する
    [検索する文字列]
    (?<a>[A-Z])(?&a)

    〔チェックボックス〕
    [一致する文字列を数える(U)]:ON
    上記以外のチェックボックスすべて:OFF
    〔ラジオボタン〕
    [正規表現(X)]:ON

    [高度]
     〔チェックボックス〕
     [CRとLFを区別する(T)]:ON
     [次を検索/前を検索で重ならない文字列のみ一致する(F)]:ON
     上記以外のチェックボックスすべて:OFF
     [正規表現エンジン(G)]:Onigmo
     [正規表現で検索する追加行数(L)]:0

    4.[次を検索]を実行する

    5.結果の確認
    「正規表現には構文エラーが含まれています。」のエラーメッセージボックスが表示されて、実行に失敗する。

    Onigmoは、SyntaxオプションにPerlがあり本来は使用することができるが、できないEmEditor側が関数呼出時に文法を指定せずに呼び出しているため、SyntaxがデフォルトのRubyになってBoost.RegexのデフォルトのPerlと一致して使用できないバグ
    ==>Onigmoの関数仕様を確認しください。プログラム作成者が関数の仕様と、正規表現のSyntaxの種類を全く理解しておらず、Boost.RegexのSyntaxと一致するように実装しなかったことが原因です。

    6.検証
    6.1 検索を開いて、下記の通り設定する
    3.の設定手順のうち、下記の項目のみ変更して、設定する。
    [検索する文字列]
    (?<a>[A-Z])(\g<a>)

    6.2 [次を検索]を実行する

    6.3 確認
    正しくAAの文字が選択され、DC、BAも含むすべてのAからZの2文字の組が背景色緑色で強調表示される。

    6.1で[正規表現エンジン(G)]を既定(Boost.Regex)に変更すると、DC、BAは文字列選択と強調表示はされない。
    \gは指定グループ名の「一致した結果」を呼び出しているため(SyntaxがPerlの場合)。

    6.1で[正規表現エンジン(G)]を既定(Boost.Regex)に、[検索する文字列]を(?<a>[A-Z])(?&a)に変更すると、DC、BAも文字列選択と強調表示となる。
    これが、3.で期待している結果になります。
    (?& )は、指定グループ名の「正規表現」を呼び出しているため(SyntaxがPerlの場合)。

1 件の投稿を表示中 (合計 2 個)
  • このトピックに返信するにはログインしてください。