タグ: 正規表現不具合
- 作成者投稿
- 2024年8月31日 2:44 pm #31895yasuji参加者
江村様
いつもお世話になっております。
yasujiです。\Rとその等価表現である
(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])
および(?>\x{0D}\x{0A}?|[\x{0A}-\x{0C}\x{85}\x{2028}\x{2029}])
の正規表現文字列で正規表現検索を行うと行末の改行に一致することができず機能しない不具合です。ただし、すべてのパターンは試していませんが、Unicode改行コードの0x85, 0x2028, 0x2029には一致するようです。
※等価表現の一つ目はBoost.Regexのみ使用でき、2つ目はBoost.RegexとOnigmoで使用できます。(正規表現エンジンごとに対応している正規表現の差です)上記不具合の発生の再現手順は下記の通りです。
〔対象〕
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.検索を開いて、下記の通り設定する
[検索する文字列]
\R
〔チェックボックス〕
[一致する文字列を数える(U)]:ON
上記以外のチェックボックスすべて:OFF
〔ラジオボタン〕
[正規表現(X)]:ON[高度]
〔チェックボックス〕
[CRとLFを区別する(T)]:ON
[次を検索/前を検索で重ならない文字列のみ一致する(F)]:ON
上記以外のチェックボックスすべて:OFF
[正規表現エンジン(G)]:既定(Boost.Regex)
[正規表現で検索する追加行数(L)]:04.[次を検索]を実行する
5.結果の確認
文字列選択はできず、ステータスバーに「0個の一致(0行)が見つかりました。」と表示される。
\Rは、Unicode改行を含むあらゆる改行に一致する特別なエスケープ文字です。
したがって、すべての行末に一致して、「15個の一致」と表示されるのが正しいです。
[正規表現エンジン(G)]をOnigmoに設定しても結果は変わりません。
改行一致できないバグです。Matching Line Endings – Perl Regular Expression Syntax (Boost 1.84.0 Library Documentation)
Matching Line Endings
The escape sequence \R matches any line ending character sequence, specifically it is identical to the expression (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]).
6.検索を開いて、下記の通り設定する
[検索する文字列]
\R
〔チェックボックス〕
[一致する文字列を数える(U)]:ON
上記以外のチェックボックスすべて:OFF
〔ラジオボタン〕
[正規表現(X)]:ON[高度]
〔チェックボックス〕
[CRとLFを区別する(T)]:ON
[次を検索/前を検索で重ならない文字列のみ一致する(F)]:ON
上記以外のチェックボックスすべて:OFF
[正規表現エンジン(G)]:既定(Boost.Regex)
[正規表現で検索する追加行数(L)]:20007.[次を検索]を実行する
8.結果の確認
一回目のボタン押下では、エラーになり、ステータスバーに「0個の一致(0行)が見つかりました。」と表示される。
しかし、2回以上ボタンを連続して押下すると、行末の改行が選択される動作になり、ステータスバーに表示された結果と異なる動作バグです。正しい動作は、5.と同じです。
9.検索を開いて、下記の通り設定する
[検索する文字列](Boost.Regexの場合)
(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])
[検索する文字列](Onigmoの場合/Boost.Regexも可)
(?>\x{0D}\x{0A}?|[\x{0A}-\x{0C}\x{85}\x{2028}\x{2029}])
〔チェックボックス〕
[一致する文字列を数える(U)]:ON
上記以外のチェックボックスすべて:OFF
〔ラジオボタン〕
[正規表現(X)]:ON[高度]
〔チェックボックス〕
[CRとLFを区別する(T)]:ON
[次を検索/前を検索で重ならない文字列のみ一致する(F)]:ON
上記以外のチェックボックスすべて:OFF
[正規表現エンジン(G)]:既定(Boost.Regex)
[正規表現で検索する追加行数(L)]:010.[次を検索]を実行する
11.結果の確認
文字列選択はできず、ステータスバーに「0個の一致(0行)が見つかりました。」と表示される。
9.の2つの正規表現文字列は、\R
の等価の正規表現です。正しい動作は、5.と同じです。
[正規表現で検索する追加行数(L)]を2000に設定して9.から10.を実行した場合は、結果の確認は8.と同じになる。
12.検証
12.1 Notepad++を開いて2.を入力する12.2 検索を開いて、下記の通り設定する
[検索する文字列]
\R
〔チェックボックス〕
[先頭/末尾から再検索(P)]:ON
上記以外のチェックボックスすべて:OFF
〔検索モード〕
[正規表現(G)]:ON
[.は改行と一致]:OFF12.3 [次を検索]を実行する
12.4 結果の確認
1行目の改行が文字列選択される。
[数える(T)]を実行すると、「数える:15件の一致」と表示される。正しい動作と、結果表示がされる。
9.の[検索する文字列]を設定して、12.1から12.3を実行した場合も、上記と同じ結果になる。
- 作成者投稿
- このトピックに返信するにはログインしてください。