上https://www.emacswiki.org/emacs/MultilineRegexp 1は、使用にヒントを見つけます
[\ 0- \ 377 [:nonascii:]] * \ n
標準の代わりに
。* \ n
巨大なテキスト(37 KB)のスタックオーバーフローを回避するために、改行までの任意の文字を照合します。ここでのオーバーフローは懸念事項ですか、それとも前者のマッチング実行は後者よりもパフォーマンスが高いですか?
上https://www.emacswiki.org/emacs/MultilineRegexp 1は、使用にヒントを見つけます
[\ 0- \ 377 [:nonascii:]] * \ n
標準の代わりに
。* \ n
巨大なテキスト(37 KB)のスタックオーバーフローを回避するために、改行までの任意の文字を照合します。ここでのオーバーフローは懸念事項ですか、それとも前者のマッチング実行は後者よりもパフォーマンスが高いですか?
回答:
Emacsの正規表現で.
は、すべての文字とは一致しません。これはの同義語です[^\n]
。したがって、使用する理由[\0-\377[:nonascii:]]
は、「任意の文字、改行も」に一致させたい場合です。
スタックをオーバーフローするWRTは、.*\n
非常に効率的に処理する必要があります。つまり、バックトラックせず、スタックを使い果たすことはありません。それどころか[\0-\377[:nonascii:]]*\n
、Emacsの正規表現エンジンは、一致するすべての文字に対してスタックのビットを使い果たし、「巨大な」テキストではスタックからオーバーフローする傾向があるため、かなり非効率的に処理されます。
emacswikiが提案し、提案[\0-\377[:nonascii:]]*
しないことに注意してください[\0-\377[:nonascii:]]*\n
。
[\0-\377[:nonascii:]]*
なるのかわかりません\\(.\\|\n\\)*
。だから、これはemacswikiが間違っていると思います。
|
はバックトラックがさらに必要になる可能性があると想像できますが、実際にそうであるかどうかは、コンパイル方法によって異なります。
[\0-\377[:nonascii:]]*
(このpoint-max
ような正規表現で検索するのではなく使用することもあるので、これはかなり珍しいことです)(好奇心が強い:問題の核心は、一致できる文字のセットが*が*内で一致する可能性のある文字のセットから切り離された後。それが切り離されている場合、正規表現エンジンは中間ステップの記録をスキップするため、スタックスペースの浪費を回避します。したがって、スタックを消費しない.*\n
で[^a]*a
ください。.*a
します)。