私はフォームの(種)名を解析しています:
Parus Ater
H. sapiens
T. rex
Tyr. rex
通常は 2 つの項 (二項式) がありますが、3 つ以上の項がある場合もあります。
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
私が書いた
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
ほとんどの場合は機能しましたが、無限ループに陥ることがありました。それが正規表現マッチングにあることを突き止めるのに少し時間がかかりましたが、それがタイプミスであることに気づき、書くべきでした
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
これは適切に実行されます。
私の質問は次のとおりです。
- なぜこのループが起こるのですか?
- プログラムを実行する前に同様の正規表現エラーをチェックする方法はありますか? そうしないと、プログラムが配布される前にそれらをトラップすることが困難になり、問題が発生する可能性があります。
[注: 種のより一般的な表現は必要ありません - 種の名前には正式な 100 行以上の正規表現仕様があります - これは最初のフィルターにすぎません]。
注: ほとんどの名前は正確に 2 語または場合によっては 3/4 語 (イタリック体で表示されている) に抽出されていましたが、いくつかの誤検出 ( など"Homo sapiens lives in big cities like London"
) があり、一致が "L" で失敗したため、問題が発生しました。
注: これをデバッグしているときに、正規表現はしばしば完了していましたが、非常に遅いことがわかりました (たとえば、ターゲット文字列が短い場合)。病理学的なケースを通じてこのバグを発見したことは貴重です。私は重要な教訓を学びました!