タグ: 正規表現不具合
- 作成者投稿
- 2024年8月30日 11:46 pm #31890yasuji参加者
江村様
いつもお世話になっております。
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)]:04.[次を検索]を実行する
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の文字が背景色緑色で強調表示される。2024年9月1日 7:15 am #31896yasuji参加者申し訳ありません。私の記載ミスで、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)]:04.[次を検索]を実行する
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の場合)。2024年9月29日 10:15 am #31952Yutaka Emuraキーマスターいつもお世話になっております。江村です。
v24.3.905 にて対応いたしました。
– 正規表現エンジンのリストに「Onigmo.Perl」を追加しました。以前の「Onigmo」は「Onigmo.Ruby」と呼ばれるようになりました。
よろしくお願いいたします。
2024年9月29日 6:21 pm #31956yasuji参加者いつもお世話になっております。
yasujiです。EmEditor v24.3.905において、 正規表現エンジンのリストから「Onigmo.Perl」を選択することで、OnigmoのPerl文法が使用できることを確認できました。
念のため、「Onigmo.Ruby」は、6.を実施してRuby文法であることを確認しました。よろしくお願いします。
2024年9月29日 11:38 pm #31959yasuji参加者いつもお世話になっております。
yasujiです。追加された「Onigmo.Perl」について確認があります。
「Onigmo.Perl」は、Onigmoのソースコードregsyntax.cに示されている OnigmoSyntaxPerl (Perl 5.10+) を指定しているのでしょうか?Onigmoは、OnigmoSyntaxPerl58 (Perl 5.8)、OnigmoSyntaxPerl58_NG (Perl 5.8 + named group)、OnigmoSyntaxPerl (Perl 5.10+) の3つのPerlバージョンのPerl文法をサポートしており、使える正規表現に差があるため。
もし、質問の回答が別のバージョンだった場合は、そのバージョンが同定できるように変更いただくのとOnigmoSyntaxPerl (Perl 5.10+)の追加をお願いしたいです。よろしくお願いします。
2024年9月30日 6:19 pm #31963yasuji参加者いつもお世話になっております。
yasujiです。申し訳ありません。ひとつ前の確認の内容に記載ミスがありましたので修正いたします。
OnigurumaとOnigmoのソースコードのPrefixがOnigと表記されて同じで取り違いないようにするため、Onigmo側のPrefixのOnigをOnigmoへ置換して確認していたものをそのまま書いてしまいました。OnigmoSyntaxPerl58 ==> OnigSyntaxPerl58
OnigmoSyntaxPerl58_NG ==> OnigSyntaxPerl58_NG
OnigmoSyntaxPerl ==> OnigSyntaxPerl修正して下記に再掲いたします。
—————————-
追加された「Onigmo.Perl」について確認があります。
「Onigmo.Perl」は、Onigmoのソースコードregsyntax.cに示されている OnigSyntaxPerl (Perl 5.10+) を指定しているのでしょうか?Onigmoは、OnigSyntaxPerl58 (Perl 5.8)、OnigSyntaxPerl58_NG (Perl 5.8 + named group)、OnigSyntaxPerl (Perl 5.10+) の3つのPerlバージョンのPerl文法をサポートしており、使える正規表現に差があるため。
もし、質問の回答が別のバージョンだった場合は、そのバージョンが同定できるように変更いただくのとOnigSyntaxPerl (Perl 5.10+)の追加をお願いしたいです。よろしくお願いします。
2024年9月30日 6:39 pm #31964Applek参加者yasuji様 いつも読ませていただいております。
正規表現にたいへん詳しいと思います。
シングルラインモードの標準機能で高速化のスレッドで [^⏎❖◆]{1,500000}?このような範囲指定の大きい数字指定が出来ないので使えないシチュエーションがある問題は何か解決方法がありましたら教えていただけますと幸いです。
https://jp.emeditor.com/forums/topic/%e3%82%b7%e3%83%b3%e3%82%b0%e3%83%ab%e3%83%a9%e3%82%a4%e3%83%b3%e3%83%a2%e3%83%bc%e3%83%89%e3%81%ae%e6%a8%99%e6%ba%96%e6%a9%9f%e8%83%bd%e3%81%a7%e9%ab%98%e9%80%9f%e5%8c%96/2024年10月1日 9:37 am #31965Yutaka Emuraキーマスターいつもお世話になっております。江村です。
OnigSyntaxPerl (Perl 5.10+) を指定しています。
よろしくお願いいたします。
2024年10月1日 8:16 pm #31967yasuji参加者いつもお世話になっております。
yasujiです。OnigSyntaxPerl (Perl 5.10+) を指定しています。
使用できる正規表現の多いものを指定していただきありがとうございます。気にしていたことが解消できて安心できました。
よろしくお願いします。
- 作成者投稿
- このトピックに返信するにはログインしてください。