Wyrażenia regularne

dział ogólny

Wyrażenia regularne

Nowy postprzez beherit » wtorek, 15 października 2013, 13:56

Mam problem z wyrażeniami regularnymi w C++Builder XE4. Chcę sprawdzać czy dany ciąg znaków jest ścieżką do pliku na dysku. W tylu utworzyłem następujące wyrażenie (sprawdzane za pomocą regexpal.com):
Kod: Zaznacz cały
^[\w]:(\\[a-zA-Z 0-9~`!@#$%^()!_-{};',\+\=\[\]]*)*\.[a-zA-Z0-9]*$

Teraz wrzuciłem to do kodu swojego programu i niestety wywala błąd przy wywołaniu:
Kod: Zaznacz cały
wchar_t* input = Text.w_str();
wregex exrp(L"^[\w]:(\\[a-zA-Z 0-9~`!@#$%^()!_-{};',\+\=\[\]]*)*\.[a-zA-Z0-9]*$");
if(regex_match(input, exrp))
{
  //jakiÅ› tam kod
}

Doszedłem do tego, że aplikacja wywala się przez postać wyrażenia, więc testowo zmieniłem je na poniższe:
Kod: Zaznacz cały
wregex exrp(L"^[\w]:(\\[a-zA-Z 0-9]*)*\.[a-zA-Z0-9]*$");

Według regexpal.com wyrażenie nadal działa (nie uwzględniając ścieżek ze specjalnymi znakami) lecz w aplikacji za każdym razem regex_match zwraca FALSE. No i mam dwa problemy:
1. Dlaczego aplikacja się wywala przy pełnym wyrażeniu jakie chcę podać?
2. Dlaczego wyrażenie za każdym razem zwraca FALSE mimo, że regexpal.com informuje o prawidłowości wyrażenia.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wyrażenia regularne

Nowy postprzez Mironas » wtorek, 15 października 2013, 16:43

A nie prościej użyć FileExists(...) ?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
PodziÄ™kowaÅ‚ : 17
OtrzymaÅ‚ podziÄ™kowaÅ„: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Wyrażenia regularne

Nowy postprzez beherit » wtorek, 15 października 2013, 16:50

Niestety nie, bo w ciągu znaków lecą głównie inne rzeczy (wiadomości jednego użytkownika do drugiego w komunikatorze). Udało mi się dojść do tego, że wina leży po stronie samego wyrażenia - różni się ono znacznie od tego, które działa w php ;) Mam teraz takie:

Kod: Zaznacz cały
wregex exrp(L"^[a-zA-Z]:(.*?)[.]+[a-zA-Z0-9]+$");


Niestety przepuszcza ono również rzeczy, które nie są ścieżkami. Chodzi głównie o (.*?) - da się tam dodać, aby na początki był znak "/" ?
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: Wyrażenia regularne

Nowy postprzez Cyfrowy Baron » Å›roda, 16 października 2013, 08:31

Problem w tym, że ścieżka nie różni się zbytnio od zwykłego tekstu. O ile początek zawsze ma taką samą postać: litera_dysku:\ lub http:// o tyle koniec ścieżki raczej nie sposób określić.

beherit napisał(a): różni się ono znacznie od tego, które działa w php ;)


To oczywiste. Wyrażenia regulrna w BC++ działają trochę inaczej. Temat wyrażeń był swego czasu szeroko omawiany na tym forum - poszukaj.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron