2015-11-15 7 views
6

Ich habe versucht, die folgende regex:Wie passt man Zeilenumbrüche in C++ Regex an?

const static char * regex_string = "([a-zA-Z0-9]+).*"; 

void find_first(const std::string str); 

int main(int argc, char ** argv) 
{ 
     find_first("0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg"); 
} 
void find_first(const std::string str) 
{ 
     std::cout << str << std::endl; 
     std::regex rgx(regex_string); 
     std::smatch matcher; 
     if(std::regex_match(str, matcher, rgx)) 
     { 
       std::cout << "Found : " << matcher.str(0) << std::endl; 
     } else { 
       std::cout << "Not found" << std::endl; 
     } 
} 

DEMO

ich die Regex erwartet völlig korrekt ist und die Gruppe zu finden. Aber es war nicht. Warum? Wie kann ich den Zeilenumbruch in C++ Regex anpassen? In Java funktioniert es gut.

+0

Es ist '$' im regulären Ausdruck IIRC. –

+0

Haben Sie versucht, '(. | \ R \ n) *' anstelle von '. *' Zu finden? – Zereges

Antwort

4

Die dot in regex entspricht normalerweise einem anderen Zeichen als einem Zeilenvorschub std::ECMAScript syntax.

.   newLine   nicht alle Zeichen außer Linie Terminatoren (LF, CR, LS, PS).

0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg 
[a-zA-Z0-9]+ matches until \r ↑___↑ .* would match from here 

In vielen Regex-Varianten gibt es eine dotall Flagge verfügbar den Punkt auch Zeilenumbrüche passen zu machen.

Wenn nicht, gibt es Workarounds in verschiedenen Sprachen wie [^]nicht nichts oder [\S\s] beliebige Leerzeichen oder nicht-Leerzeichen zusammen in einer Klasse Wich Ergebnisse in einem beliebigen Zeichen einschließlich \n

regex_string = "([a-zA-Z0-9]+)[\\S\\s]*"; 

Oder optional Zeile Pausen: ([a-zA-Z0-9]+).*(?:\\r?\\n.*)* oder ([a-zA-Z0-9]+)(?:.|\\r?\\n)*

See your updated demo

+0

Cool, danke. Du hast gefangen was ich wollte. –

1

Sie können versuchen const static char * regex_string = "((.|\r\n)*)"; Ich hoffe, es wird Ihnen helfen.

+0

Sie müssten die '\' Zeichen – Sopel

+0

hmm, Verwenden \\ anstelle von \ Zeichen. –

+0

Oder verwenden Sie eine rohe Zeichenfolge "R" (((. | \ R \ n) *)) "' – Broxzier