Help:CirrusSearch/RegexTooComplex/ja

構文は、Lucene の方言で書かれた正規表現の検索を比較的効率的に実装しています. 効率の理由から、これらの正規表現がどれほど複雑かには制限があります.



どのような構文が複雑と見なされるか?
非決定性のあとに繰り返しが続くことで、最も複雑度が増加します. 以下のようなものです:

insource:/[ac]*a[ac]{50,200}/

部分は非決定的で、 部分は繰り返しです. 一方、以下のようにすると改善されます:

insource:/[ac]*a[de]{50,200}/

これは、 が   と重ならないためです. それでも複雑であり完全に高速化できませんが、即座には却下されず一致を試みます.

Generally the repetition adds more complexity than it is worth. Better to just repeat, so:

insource:/[ac]*a.*[^"]+\"/

is much less complex than:

insource:/[ac]*a.*[^"]{50,100}\"/



理由
Lucene compiles regular expressions to DFAs. It does this by converting the regular expressions to NFAs and then converting those to DFAs. The worst case complexity for that operation is exponential on the number of states in the NFA and the NFA's number of states is related to the. Non-determinism followed by repetition followed by repetition triggers that exponential state growth. We limit the number of states to 20,000 to prevent them from eating all of our memory.