#includeWynik jest taki: znalazlem !!! 140735066061824 140735066067738 A pierwsza liczba powinna być pozycją pierwszego znaku w znalezionym ciągu a tu bach Nie wiem gdzie regexp to znalazł chyba na krańcach pamięci albo poza nią> #include #include using namespace std; int main (int argc, const char *argv[]) { string txt = "jakis tekst onet inne 15"; const char* pattern = "\\d+"; regex_t exp; // tutaj trzyma przetworzony wzorzec regmatch_t match; // przetrzymuje pozycje znalezionego tekstu // sprawdzanie poprawnosci wyrazenia regularnego if(regcomp(&exp, pattern, REG_EXTENDED) != 0) { cout << "Bad Pattern !" << endl; return 0; } if(regexec(&exp, txt.c_str(), 1, &match, 0) != 0) { cout << "Znalazlem !!!" << endl; cout << match.rm_so << endl << match.rm_eo << endl; } regfree(&exp); return 0; }
Wyrażenia regularne w C++ i problem ze zwracaniem pozycji znalezionego ciagu
Rozpoczęty przez
macsurf
, 29 gru 2013 20:52
4 odpowiedzi w tym temacie
#1
Napisano 29 grudnia 2013 - 20:52
Witam
Mam problem z funkcjami z regex.h na jednym programie wszystko chodzi prawidłowo, tzn zwraca pozycje znalezionego ciągu tak jak powinno w drugim natomiast napisałem tylko sampla dla regexów i zwraca jakieś dziwne liczby - bynajmniej nie są to adresy szukanego cstringu.
Podaje przykład z najprostszym patternem ( normalnie był wzorzec do wycinania urli z ciągu ):
#2
Napisano 29 grudnia 2013 - 21:04
If a match is found, the regexec() function returns 0. If no match is found, the regexec() function returns REG_NOMATCH. Otherwise, it returns a nonzero value indicating an error. A nonzero return value can be used in a call to the regerror() function.
#3
Napisano 29 grudnia 2013 - 21:21
Dzięki, teraz jest wszystko OK no prawie
Np. w PHP regs w stylu: <(.*?)> działał bez problemów, tutaj znak "?" jest niedopuszczalny, od razu funkcja sprawdzająca wyrażenie zwraca błąd. Widocznie to jest jakiś inny typ regsów, są w stylu PERLa i inne a tutaj sam nie wiem co jest. Chyba będzie trzeba się gimnastykować w ograniczki w stylu< ([^>]+)> a szkoda bo z "?" robiło się to znacznie szybciej i bardziej intuicyjnie Na stronie z opisem biblioteki nie widziałem jakiś innych możliwości wyboru typu regexów w standardzie jest REG_EXTENDED.
#4
Napisano 29 grudnia 2013 - 21:40
Zgodnie z tym co czytam "?" powinien działać.
Pokaż kod który nie działa.
#5
Napisano 30 grudnia 2013 - 20:55
Niestety w standardowej bibliotece regex nie ma opcji aby wyszukiwanie typu non-greedy działało więc taka forma jest nieprawidłowa: ".*?"
Tak jest wg standardu POSIX aby była możliwość korzystania z "non-greedy" pozostaje aktualnie skorzystać z biblioteki: PCRE - Perl Compatible Regular Expressions
tam są regsy w stylu PERL.
Tak jest wg standardu POSIX aby była możliwość korzystania z "non-greedy" pozostaje aktualnie skorzystać z biblioteki: PCRE - Perl Compatible Regular Expressions
tam są regsy w stylu PERL.
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych