2014-09-01 12 views
5

Używam VS2010 i kodowania C Zastosowanie konsoli ++ i stanęła przed problememco jest nie tak z regex_match? bardzo proste wyrażenie

#include <regex> 
using namespace std; 

//... 

if (!regex_match("abab",regex("(ab?)*"))) 
{ 
    //the problem is - why we are here? why it doesn't match? 
} 

sprawdzone tutaj http://regexpal.com/ - pasuje

+5

Wiele implementacji biblioteki wyrażeń regularnych ma charakter szkicowy, szczególnie w VS 2010. Należy pamiętać, że VS 2010 to ** nie ** kompilator C++ 11, po prostu obsługuje funkcje _some_ C++ 11. –

+0

@CaptainObvlious masz rację !! Testuję to w VS2012, w ten sposób regex pasuje do mnie. –

+0

[Działa z gcc] (http://coliru.stacked-crooked.com/a/65f607082de2cc06). –

Odpowiedz

0

Bardzo prosta: regex_match zwraca tylko prawdziwe, jeśli cała sekwencja zostanie dopasowane. Możesz użyć regex_search, jeśli chcesz sprawdzić, czy łańcuch zawiera twoje wyrażenie regularne.

"ab?" pasuje do "aba", repeater ("() *") sprawiają, że ten mecz raz. Pozostała część to "b", więc nie jest to pełna zgodność.

Przykro mi, źle odczytałem wyrażenie regularne. Powinien to być pełny mecz. tyle dziwne:

regex_match("aab", regex("(ab?)*")) == true 

Wydaje się, że błąd w STL (stosowanego badanego QT Twórcy 2010.05, makespec = VS2010). Zastępowanie regex_match przez regex_search w twoim kodzie pasuje do prawej, ale wyniki match_ są puste - co oznacza, że ​​coś jest nie tak.

Z VS2012 wszystkie testy zostały poprawnie dopasowane.