2012-06-20 18 views
5

Nie mogę sprawić, że mój regex działa poprawnie. W tekście wielowierszowym w ECMAScript to wyrażenie regularne begin\n([\s\S]*\nend)? dokładnie odpowiada temu, czego potrzebuję, i I tested it here.C++ std :: regex składnia wieloliniowa

Kiedy tłumaczę to na C++, nie pasuje do tego samego tekstu.

Oto mój kod w Visual C++ 2010:

#include <iostream> 
#include <regex> 

int main(int argc, char *argv[]) { 
    std::regex metadataBlockRegex("begin\\n([\\s\\S]*\\nend)?", 
     std::regex::ECMAScript); 

    std::string text = 
     "begin\n" 
     " 123\n" 
     "end\n"; 

    std::sregex_iterator blocksBegin(text.begin(), text.end(), metadataBlockRegex); 
    std::sregex_iterator blocksEnd; 

    for (auto blockMatch = blocksBegin; blockMatch != blocksEnd; ++blockMatch) { 
      std::cout << (*blockMatch)[0].str(); 
    } 
    return 0; 
} 

to wyłącznie wyjście "begin" i spodziewałem się, że pasuje do całego tekstu.

Moje pytanie brzmi: co tu jest nie tak i gdzie mogę znaleźć szczegółowy opis składni silników i jak radzą sobie z ciągami wielowierszowymi.

+0

Ten program wypisuje cały tekst (z wyjątkiem ostatniego '\ n', który nie jest dopasowany) z kodem ++/libC++ – Cubbi

+0

Zachowuje się tak, jak Gart opisuje w MSVC10. Nowa linia nie jest dopasowana, a niether jest czymkolwiek po niej. –

+0

Również wypisuje cały ciąg z 'boost :: regex' –

Odpowiedz

-1

LWG 2503 dodano opcję składni multiline, która powinna sprawić, że twój program będzie działać zgodnie z oczekiwaniami, gdy użyjesz tej opcji (w przypadku implementacji C++, które obsługują tę nową funkcję).

LWG 2343 ma trochę więcej tła, który wyjaśnia, że ​​obiekty ECMAScript RegExp mają właściwość multiline, które domyślnie false i zachowanie różnych C++ regex wdrożeń.

Original odpowiedź od 2012:

co jest nie tak tutaj

Nie wiem, wygląda OK, ale tylko C++ 11 implementacje Mam dostęp do nie obsługują <regex>

gdzie można znaleźć szczegółowy opis składni silników std :: regex i jak radzą sobie z ciągami wielowierszowymi.

Nie można, o ile wiem. Najlepszym miejscem do obejrzenia jest prawdopodobnie dokumentacja dla Boost.Regex, ale należy pamiętać, że została przeniesiona, ponieważ zaproponowano jej standaryzację i ma pewne funkcje niedostępne w std::regex.

+0

To bardzo smutne – Gart

+0

Josuttis ma opis tego, jak różne są gramatyki regex. Obserwowane zachowanie będzie zgodne z gramatyką egrep, gdzie \ n oddziela naprzemienne wzory, więc 'begin' jest poprawnym dopasowaniem do pierwszego wzorca. Gramatyka ECMAScript nie powinna jednak tak traktować. –

5

Bez wsparcia wieloliniowego, tak czy inaczej ... nie w MSVC10.

Trzeba fałszywej multilinii z \ r & \ n w swoich wzorcach. To poważny bummer.