CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Jak stworzyć wyrażenie regularne?

Jak stworzyć wyrażenie regularne?

dział ogólny

Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 20:35

Mam problem z wyrażeniem regularnym dla takiego tekstu:

KOD text:     UKRYJ  
"<autor>Temat wiadomości.<br>druga część"


Mam taki kod:

KOD cpp:     UKRYJ  
 char* input_string = L"<autor>Temat wiadomości.<br>druga część</koniec>";

 regex exrp(L"<([^>])(.*)"); /* co powinno być tutaj */
 match_results<const char*> what;

 regex_search(  input_string, what, exrp );

 Edit1->Text = sToString( what[0] ) + " :: " + sToString( what[1] )  + " :: " + sToString( what[2] );
Jak z tego wydobyć tekst: Temat wiadomości. i druga część? W grę wchodzą tylko regex'y boost.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 21:11

http://www.boost.org/doc/libs/1_46_1/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html
W końcu znalazłem, że boost wykorzystuje składnie Perla, zawsze myślałem, że ma coś własnego.
A to co Cię interesuje to lookahead i lookbehind. Są w dokumentacji, jak cała masa innych informacji dotyczących konstruowania wyrażeń (nie podam Ci dokładnie z głowy jak ma wyglądać wyrażenie, bo to nie mój język)
Ale masz tam akurat przykład zastosowania, więc chyba sobie poradzisz.
---
chwileczkę, zaraz podam Ci wyrażenie...

w sumie to dokładnie nie wiem... ale to powinno wystarczyć. Nie wiem czy w tej Twojej składni znaki "<" i ">" jako samodzielne są używane jak modyfikatory lub część tworząca wyrażenie. Spróbuj, a jak nie pójdzie to pokaż co wyrzuci.
Kod: Zaznacz cały
(?=<)(.*?)(?<=>)
Ostatnio edytowano niedziela, 5 czerwca 2011, 21:18 przez Slynx, łącznie edytowano 1 raz
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 21:14

Takich przykładów to ja mam całą masę. Potrzebuję przykładu prostego wyrażenia, które będę mógł przeanalizować i zrozumieć jak układa się te wyrażenia, bo póki co, to nie wszystko jest dla mnie jasne.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 21:20

Ale czego Ty nie rozumiesz ? Tam masz całą dokumentację, przykłady... wystarczy kilka ćwiczeń, analiza.
Zresztą.
Już Ci kiedyś mówiłem. Ściągnij sobie Regex Buddy. Tam masz wszystko czego potrzebujesz. Zapewniam. I składnie tworzenia wyrażeń z 19 języków, rozpiskę, tester, debugger. Zainstaluj, wrzuć jakąś templatkę z bazy i zobaczysz na czym to polega.
Sprawdziłem właśnei w regex buddy. Składnia dla Perla wygląda tak
Kod: Zaznacz cały
(?<=>)(?s:(.*?))(?=<)

Wyszukuje tekst pomiędzy znacznikami (ignoruje znaczniki)
Prosta składnia (choć nie wiem czy jest idealne)
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » niedziela, 5 czerwca 2011, 21:49

Niestety to wyrażenie nie działa dobrze. Otrzymałem wynik:

Temat wiadomości. ::: Temat wiadomości.

a powinienem otrzymać:

Temat wiadomości. ::: druga część
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Slynx » niedziela, 5 czerwca 2011, 22:09

Pokaż cały kod - porównam to u siebie.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 09:16

Przecież kod podałem niżej. Nie wiedziałem tylko jak ułożyć wyrażenie. Powtarzam kod, ale teraz z Twoim wyrażeniem:

KOD cpp:     UKRYJ  
char* input_string = "<autor>Temat wiadomości.<br>druga część</koniec>";

 regex exrp("(?<=>)(?s:(.*?))(?=<)");
 match_results<const char*> what;

 regex_search(  input_string, what, exrp );

 Edit1->Text = sToString( what[0] ) + " :: " + sToString( what[1] )  + " :: " + sToString( what[2] );
Funkcja sToString jest moja i służy do konwersji wartości typu csub_match na AnsiString:

KOD cpp:     UKRYJ  
String sToString(const csub_match what)
{
 return String( string( what ).c_str() );
}
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez polymorphism » poniedziałek, 6 czerwca 2011, 09:47

O to chodzi: <autor>([^<>]*)<br>([^<>]*)<\/koniec> :?:
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 10:05

No niestety nie działa. Za cholerę nie rozumiem co się z czego bierze. W sieci nie można znaleźć nic co by jasno i w sposób zrozumiały opisywało zasadę tworzenia wyrażeń regularny. Same opisy metatagów. Odnoszę wrażenie, że nikt z udzielających porad nie rozumie do końca tych wyrażeń, a jak ktoś to rozumie, to nie udziela żadnych informacji.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez polymorphism » poniedziałek, 6 czerwca 2011, 10:28

A podwoiłeś backslasha? Podałem wyrażenie w formie zwykłego tekstu, nie jako literał tekstowy.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 10:41

Nic to nie zmienia.

Użyłem wyrażenia:

KOD text:     UKRYJ  
((<autor>)(.*))(<br>)(.*)


Uzyskuję co chciałem, ale dopiero na pozycjach 3 i 5.
Testowałem to wyrażenie w RegexBuddy, ale w tym programie ono nie działa, działa jednak u mnie. Tymczasem wyrażenia złożone w RegexBuddy nie działają w mnie.
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 10:49

Nowa wersja RegexBuddy 4.3.2 podaje mi już prawidłowe wyniki. Udało mi się poprawić wyrażenie:

KOD text:     UKRYJ  
(<autor>)(.*)(<br>)(.*)


Teraz mam prawidłowy wynik na pozycji drugiej i czwartej, co się zgadza z podziałem, gdzie (.*) mam właśnie na pozycji drugiej i czwartej.

Jak zrobić by pozycje 1 (<autor>) i 3 (<br>) nie musiały być definiowane jawnie, gdyż między tymi nawiasami nie koniecznie muszą być takie wyrazy?
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez polymorphism » poniedziałek, 6 czerwca 2011, 10:52

ale dopiero na pozycjach 3 i 5.

Bo tyle grup tam narobiłeś, w sumie nie wiem po co. Pewnie to tak wygląda:

  • grupa 1: <autor>Temat wiadomości. - grupa ta zawiera grupę 2 i 3
  • grupa 2: <autor>
  • grupa 3: Temat wiadomości.
  • grupa 4: <br>
  • grupa 5: druga część</koniec>
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 11:03

polymorphism napisał(a):Bo tyle grup tam narobiłeś, w sumie nie wiem po co.


Bo dopiero się uczę i jeszcze nie wszystko rozumiem. Już sobie trochę z tym poradziłem:

tekst:
KOD text:     UKRYJ  
<autor>Temat wiadomości.<br>druga część</koniec>


wyrażenie:
KOD text:     UKRYJ  
<[a-z].*>(.*)<br>(.*)</[a-z].*>


Mam jeszcze problem z tym <br>. Zakładając że między < i > mogą wystąpić dwie dowolne litery, jak skonstruować to wyrażenie?
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: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 11:14

Już sobie poradziłem z tym wyrażeniem:

KOD text:     UKRYJ  
<[a-z].*>(.*)<.[a-z]>(.*)</?[a-z].*>


Zaczyna to trochę rozumieć.

jak wykluczyć jakiś znak, czyli czego użyć w wyrażeniu, by określić jaki znak nie może wystąpić. Czy jest coś takiego?

Mam np. <br> i chcę tak stworzyć wyrażenie by akceptowało dowolne litery, czyli np: <.[a-z]>, ale żeby nie akceptowało </br>, czyli by nie dopuszczało /
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

Następna strona

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