Warum löst regex_match eine Komplexitätsausnahme aus?

Ich versuche zu testen (mitboost::regex) ob eine Zeile in einer Datei nur durch Leerzeichen getrennte numerische Einträge enthält. Ich bin auf eine Ausnahme gestoßen, die ich nicht verstehe (siehe unten). Es wäre toll, wenn jemand erklären könnte, warum es geworfen wird. Vielleicht mache ich hier etwas Dummes bei der Definition der Muster? Hier ist der Code:

// regex_test.cpp
#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;

int main(){
  // My basic pattern to test for a single numeric expression
  const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+\\.?[[:d:]]*";
  // pattern for the full line
  const string numeric_sequence_pattern = "([[:s:]]*"+numeric_value_pattern+"[[:s:]]*)+";

  regex r(numeric_sequence_pattern);
  string line= "1 2 3 4.444444444444";
  bool match = regex_match(line, r);
  cout<<match<<endl;

  //...
}

Ich kompiliere das erfolgreich mit

g++ -std=c++11 -L/usr/lib64/ -lboost_regex regex_test.cpp  

Das resultierende Programm funktionierte soweit und einwandfreimatch == true wie ich wollte. Aber dann teste ich eine Eingabezeile wie

string line= "1 2 3 4.44444444e-16"; 

Natürlich erkennt mein Muster das Format nicht4.44444444e-16 und das würde ich erwartenmatch == false. Stattdessen erhalte ich jedoch den folgenden Laufzeitfehler:

terminate called after throwing an instance of  
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >'  
  what():  The complexity of matching the regular expression exceeded predefined bounds.  
Try refactoring the regular expression to make each choice made by the state machine unambiguous.  
This exception is thrown to prevent "eternal" matches that take an indefinite period time to locate.  

Warum ist das so?
Hinweis: Das Beispiel, das ich gegeben habe, ist insofern extrem, als es in Ordnung ist, eine Ziffer weniger nach dem Punkt zu setzen. Das bedeutet

string line= "1 2 3 4.4444444e-16";

nur ergibtmatch == false wie erwartet. Also bin ich ratlos. Was passiert hier?

Danke schon mal!

Aktualisieren:
Problem scheint gelöst zu sein. Angesichts der Andeutung vonalejrb Ich habe das Muster zu überarbeitet

const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+(?:\\.[[:d:]]*)?";  

Das scheint so zu funktionieren, wie es sollte. Irgendwie ist das freigestellt optional\\. innerhalb des ursprünglichen Musters[[:d:]]+\\.?[[:d:]]* Es bleiben viele Möglichkeiten, eine lange Folge von Ziffern auf unterschiedliche Weise abzugleichen.
Ich hoffe, das Muster ist jetzt sicher. Wenn jedoch jemand eine Möglichkeit findet, sie in der neuen Form für eine Explosion zu verwenden, lass es mich wissen! Es ist für mich nicht so offensichtlich, ob das noch möglich sein könnte ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage