Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Wyrażenia regularne w C++ i problem ze zwracaniem pozycji znalezionego ciagu


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

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 ):

#include >
#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;

}

Wynik 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ą ;)

#2 Tojot

Tojot
  • 1 187 postów

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 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

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 Tojot

Tojot
  • 1 187 postów

Napisano 29 grudnia 2013 - 21:40

Zgodnie z tym co czytam "?" powinien działać. Pokaż kod który nie działa.

#5 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

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.




Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych