我正在解析形式的(物种)名称:
Parus Ater
H. sapiens
T. rex
Tyr. rex
通常有两个术语(二项式),但有时有 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]+)*
正确执行。
我的问题是:
- 为什么会发生这个循环?
- 有没有办法在运行程序之前检查类似的正则表达式错误?否则可能很难在 prgram 分发之前捕获它们并导致问题。
[注意:我不需要更通用的物种表达式——物种名称有一个正式的 100 多行正则表达式规范——这只是一个初始过滤器]。
注意:出现问题是因为尽管大多数名称被精确地提取为 2 或偶尔 3/4 项(因为它们是斜体),但仍有一些误报(如"Homo sapiens lives in big cities like London"
)并且匹配在“L”处失败。]
注意:在调试时,我发现正则表达式经常完成但速度很慢(例如在较短的目标字符串上)。我通过一个病态的案例发现了这个错误,这是很有价值的。我学到了重要的一课!