I am parsing (species) names of the form:
Parus Ater
H. sapiens
T. rex
Tyr. rex
which normally have two terms (binomial) but sometimes have 3 or more.
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
I wrote
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
which worked most of the time but occasionally went into an infinite loop. It took some time to track down that it was in the regex matching and then I realised it was a typo and I should have written
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
which performs properly.
My questions are:
- why does this loop happen?
- is there a way I can check for similar regex errors before running the program? Otherwise it may be difficult to trap them before the prgram is distributed and cause problems.
[Note: I don't need a more general expression for species - there is a formal 100+ line regex specification for Species names - this was just an initial filter].
NOTE: The problem arose because although most names were extracted precisely into 2 or occasionally 3/4 terms (as they were in italics) there were a few false positives (like "Homo sapiens lives in big cities like London") and the match fails at "L".]
NOTE: In debugging this I have found that the regex was often completing but being very slow (e.g. on shorter target strings). It is valuable that I found this bug through a pathological case. I have learnt an important lesson!
(\s+[a-z]+)+instead of\s+[a-z][a-z]+(\s+[a-z]+)*- shift66(\s*[a-z]+)?. Unless of course OP has something more after this expression. - Qtax(\s*[a-z]+)*may lead to more than one interpretation : even for a simple string, the engine can follow many paths here. - Denys Séguret