我正在解析形式为(物种)名称的内容:
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]+)*
表现良好的循环。
我的问题是:
- 这个循环为什么会发生?
- 有没有办法在运行程序之前检查类似的正则表达式错误?否则,可能很难在程序分发之前捕获它们并造成问题。
[注意:我不需要一个更通用的物种表达式 - 有一个正式的100+行物种名称的正则表达式规范 - 这只是一个初始过滤器]。
注意:问题出现的原因是,尽管大多数名称都被精确提取为2个或偶尔3/4个术语(因为它们是斜体),但也有一些误报(例如“Homo sapiens lives in big cities like London”
),并且匹配在“L”处失败。]
注意:在调试此问题时,我发现正则表达式经常完成但速度非常慢(例如,在较短的目标字符串上)。通过一个病态案例发现了这个 bug 是非常有价值的。我学到了一个重要的教训!
(\s+[a-z]+)+
而不是\s+[a-z][a-z]+(\s+[a-z]+)*
。 - shift66(\s*[a-z]+)?
一样回溯。当然,除非OP在这个表达式之后还有其他内容。 - Qtax(\s*[a-z]+)*
可能会导致多种解释:即使对于一个简单的字符串,引擎也可以在此处跟随许多路径。 - Denys Séguret