CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Regular Expressions

Regular Expressions

dział ogólny

Re: Regular Expressions

Nowy postprzez Cyfrowy Baron » sobota, 21 maja 2011, 09:32

Slynx napisał(a):Baronie, a jak chcesz kody źródłowe pod boost-a do analizy, to polecam "moorie". Kod jest open source, a wszystkie wyrażenia są pisane właśnie z wykorzystaniem bibliotek Boost, dużo ciekawych elementów znajdziesz wewnątrz


Nie no, aż tak oporny nie jestem. Zanim polymorphism mi odpowiedział już zaopatrzyłem się w odpowiednie materiały. Chciałem po prostu, żeby na forum znalazł się jak najlepszy opis problemy dla osób, które będą szukać informacji w sieci, gdyż w ten sposób trafią na to forum. Oczekiwałem jednak dużo więcej, np. pełnego opisu składni.

Pod tymi adresami można sobie o tym poczytać:

http://wiki.przemoc.net/articles/pl/regexp/boost.regex
http://rostar.pl/wyrazenia-regularne-regex-skladnia
http://magiczne.seoisem.pl/wyrazenia-regularne-regex-google-analytics/
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 XPFirefox

Re: Regular Expressions

Nowy postprzez Cyfrowy Baron » sobota, 21 maja 2011, 10:19

Testując regex-y stworzyłem sobie funkcje konwertującą wartość zwracaną przez regex na UnicodeString, wyszło mi coś takiego:

KOD cpp:     UKRYJ  
UnicodeString sToString(const csub_match what)
{
 return String( string( what ).c_str() );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char* input_string = "Subject: Re: Temat wiadomości.";

 regex exrp("^Subject: (Re: )?(.*)");
 match_results<const char*> what;

 regex_search(  input_string, what, exrp );

 Edit1->Text = sToString( what[2] );
}


Zastanawiam się, czy istnieje prostsza metoda konwersji.
Czy dałoby się tak skonstruować funkcję sToString by zamiast przekazywać argument. można było wywołać tą funkcję w ten sposób:

KOD cpp:     UKRYJ  
 Edit1->Text = what[2].sToString();
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 XPFirefox

Re: Regular Expressions

Nowy postprzez polymorphism » sobota, 21 maja 2011, 11:18

Według dokumentacji operator[] zwraca obiekt klasy sub_match, ta z kolei ma operator konwersji na std::basic_string'a. STL-owy string nie ma metody sToString, więc taka konstrukcja nie jest możliwa.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Regular Expressions

Nowy postprzez Slynx » sobota, 21 maja 2011, 11:19

Z NET-owych masz po prostu what->Value które zwraca String. Ale Ty korzystach z boosta, a tam jest dostosowane wszystko pod natywne C++, wiec wątpię by coś było. Chyba, że funkcjami Marshall-owymi... ale one chyba też są tylko w bibliotekach NET...
//
Uprzedziłeś mnie ; p
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Regular Expressions

Nowy postprzez Cyfrowy Baron » sobota, 21 maja 2011, 12:38

Dla mnie przydatne jest tutaj użycie typu wchar_t i UnicodeString, gdyż daje możliwość parsowania tekstu zawierającego znaki unicode:

KOD cpp:     UKRYJ  
#include <string>
#include <boost\\regex.hpp>

String sToString(const csub_match what)
{
 return String( string( what ).c_str() );
}

UnicodeString sToString(const wcsub_match what)
{
 return String( wstring( what ).c_str() );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 wchar_t* input_string = L"Subject: Re: Temat wiadomości.";

 wregex exrp(L"^Subject: (Re: )?(.*)");
 match_results<const wchar_t *> what;

 regex_search(  input_string, what, exrp );

 Edit1->Text =  sToString( what[2] );
}
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 XPFirefox

Re: Regular Expressions

Nowy postprzez Slynx » niedziela, 22 maja 2011, 23:34

Ok, mam jeszcze coś. Standardowe escape sequence robimy ze slashem (albo backslasem... nieistotne). Jest też do tego specjalna funkcja, znalazłem ją, ale nie działa dla pewnych znaków, dokładniej < i >. Co zrobić by wyrażenie potraktowało to jako zwykły tekst ?
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Regular Expressions

Nowy postprzez polymorphism » poniedziałek, 23 maja 2011, 10:32

Przecież nawiasy <> nie są znakami specjalnymi, więc po co je specjalnie traktować?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Regular Expressions

Nowy postprzez Slynx » poniedziałek, 23 maja 2011, 12:08

A no tak, nie powiedziałem Ci. Wyrażenie ?< (i ?= dla drugiego słowa) oznacza, że wyrażenie np. (?<xxx)(.*)(?=eee) z yyyxxxzzzeee wytnie zzz. tak więc jeśli zamiast xxx i eee wstawię sobie <xxx> i <eee> to wyrażenie będzie wyglądać
Kod: Zaznacz cały
(?<<xxx>)(.*)(?=<eee>)

I w tym momencie się pogubi i nic nie wytnie. Dlatego znaki < i > też muszę oznaczyć jako część słowa.
(tego jestem pewien, bo sprawdzałem kilkukrotnie)
Więc można to jakoś oznaczyć, zamienić ? Funkcja dla słów <xxx> i <eee> nie działa poprawnie.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Regular Expressions

Nowy postprzez polymorphism » poniedziałek, 23 maja 2011, 12:36

A to nie wystarczy po prostu <xxx>(.*)<eee>?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Regular Expressions

Nowy postprzez Slynx » poniedziałek, 23 maja 2011, 12:40

Wtedy wyrzuci dane wraz z xxx i eee na początku, a kod który Ci pokazałem wyrzuca dane bez wartości na podstawie których się wycina.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Regular Expressions

Nowy postprzez Slynx » poniedziałek, 23 maja 2011, 13:05

Ok, to nie o to chodziło. Sprawdziłem dla kilku innych przykładów. W jednym to działało w innych nie. Chodzi chyba o wszystkie znaki nieformatowane. Jak to oznaczyć ? Dałem ?s: ale to jeszcze za mało, bo i tak rozpada się na niektórych wyrażeniach.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Regular Expressions

Nowy postprzez polymorphism » poniedziałek, 23 maja 2011, 13:14

Wtedy wyrzuci dane wraz z xxx i eee na początku (...)

Ech, grupa o indeksie 1 będzie zawierać to, co trzeba.
Chodzi chyba o wszystkie znaki nieformatowane. Jak to oznaczyć ?

Patrz wcześniejsze moje posty.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Regular Expressions

Nowy postprzez Slynx » poniedziałek, 23 maja 2011, 13:20

Leciało dalej dlatego, że nie było "pytajnika", tj.
Kod: Zaznacz cały
((?s).*?)

Tak jest dobrze, przynajmniej dla tego wyrażenia (Wygenerował całe zapytanie dobrze (ok 15 użyć wyrażenia)),
sorry za zawracanie głowy, mój błąd :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Poprzednia strona

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 7 gości