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

Jak stworzyć wyrażenie regularne?

dział ogólny

Re: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » wtorek, 7 czerwca 2011, 17:43

Darek_C++ napisał(a):Kropka tyczyła tego zapisu: <[a-z].*>(.*)<.[a-z]>(.*)</?[a-z].*>


Nie rozumiem! Ja potrzebuję kropki jako metatagu, a nie jako kropki, dlatego nigdzie w tym wyrażeniu nie ma \.

Twoje wyrażenie spełnia moje oczekiwania po modyfikacji:

KOD text:     UKRYJ  
<\\w+>(.*?)<[\\w+]{1, 2}>(.*?)</\\w+>





Odnośnie wyrażenia polymorphism

KOD text:     UKRYJ  
<[a-z]+>(.*)?(?:<[a-z]{2,2}>){0,1}(.*)</[a-z]+>"


Tak nie działa poprawnie, na drugiej pozycji zwraca mi: Temat wiadomości.<br>druga część, na trzeciej nic. Gdy zamienię {0,1} na {1,1} to działa prawidłowo, czyli na drugiej pozycji zwraca mi Temat wiadomości., a na trzeciej druga część. Jednak to zmienia sens wyrażenia, gdyż <br> musi wystąpić co najmniej raz.

Zamieniełeś <[a-z].*> na <[a-z]+>. Co dokładnie w tym wyrażeniu oznacza ten plus?

Gdy pisałem o nieokreślonej liczbie tagów, to nie chodziło mi koniecznie o załatwienie tego wyrażeniem, lecz ogólnie - regex-em. Jeżeli podasz kod, to proszę dla 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 polymorphism » wtorek, 7 czerwca 2011, 18:05

Zamieniełeś <[a-z].*> na <[a-z]+>. Co dokładnie w tym wyrażeniu oznacza ten plus?

* - zero lub więcej wystąpień.
+ - co najmniej jedno wystąpienie.

Tak nie działa poprawnie (...)

U mnie na testerze działa poprawnie. Nie wiem, być może to kwestia użytej biblioteki.

Gdy pisałem o nieokreślonej liczbie tagów, to nie chodziło mi koniecznie o załatwienie tego wyrażeniem, lecz ogólnie - regex-em.

Może powiedz, co konkretnie chcesz uzyskać.
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 » wtorek, 7 czerwca 2011, 19:28

Mam zdanie jak wcześniej, ale z nieokreśloną liczbą tagów <br> w nim. Chcę wydobyć wszystkie wyrazy z tego zdania, ale oddzielnie. Wiem jak to np. zrobić zamieniając tag <br> na przecinek za pomocą wyrażeń, a potem dziele to na wyrazy z wykorzystaniem klasy TStringList, a chciałbym zrobić to za pomocą regex-ów.
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 » wtorek, 7 czerwca 2011, 19:56

Robisz to dwuetapowo:
  1. szukasz tekstu pomiędzy tagami <autor> i </koniec>
  2. to, co znajdziesz, traktujesz innym regexem w celu znalezienia tagów-delimiterów.

p.s. kodu nie podam, bo nie mam teraz zainstalowanego boosta.
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 Darek_C++ » środa, 8 czerwca 2011, 10:30

Cyfrowy Baron napisał(a):Mam zdanie jak wcześniej, ale z nieokreśloną liczbą tagów <br>

Poniższym kodem można zrealizować wyciągnięcie danych i rozbicie na składowe po <br> lub

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button22Click(TObject *Sender)
{
        string input_string ="<autorek>Jakiś ciąg znaków nr 1.<br> Jakiś ciąg znaków nr 2.<br> Jakiś ciąg znaków nr 3.<br> Jakiś ciąg znaków nr 4.<br> Jakiś ciąg znaków nr 5.<br />I kolejne ciągi 1.<br />I kolejne ciągi 2.<br />I kolejne ciągi 3.</koniec>";
        boost::regex exrp("<\\w+>(.*?)</\\w+>");
        match_results<const char*> what;
        regex_search(input_string.c_str(), what, exrp);

        Memo2->Lines->Add(((string)what[1]).c_str());
        std::string s = Memo2->Text.Trim().c_str();

        Memo2->Lines->Add("----- EXPLODE ----");

        boost::regex reg("<[br /]+>");
        boost::sregex_token_iterator it(s.begin(),s.end(),reg,-1);
        boost::sregex_token_iterator end;
        while (it!=end)
        {
                String temp = ((string)*it++).c_str();
                Memo2->Lines->Add(temp.Trim());
        }
}

OUT:
KOD cpp:     UKRYJ  
Jakiś ciąg znaków nr 1.<br> Jakiś ciąg znaków nr 2.<br> Jakiś ciąg znaków nr 3.<br> Jakiś ciąg znaków nr 4.<br> Jakiś ciąg znaków nr 5.<br />I kolejne ciągi 1.<br />I kolejne ciągi 2.<br />I kolejne ciągi 3.
----- EXPLODE ----
Jakiś ciąg znaków nr 1.
Jakiś ciąg znaków nr 2.
Jakiś ciąg znaków nr 3.
Jakiś ciąg znaków nr 4.
Jakiś ciąg znaków nr 5.
I kolejne ciągi 1.
I kolejne ciągi 2.
I kolejne ciągi 3.

Za ten post autor Darek_C++ otrzymał podziękowanie od:
Cyfrowy Baron
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak stworzyć wyrażenie regularne?

Nowy postprzez Cyfrowy Baron » środa, 8 czerwca 2011, 16:40

Dzięki!

To mi przypomina trochę vector-y.

Trochę to sobie zmodyfikowałem, gdyż ja potrzebuję zamiast wyrażenia: <[br /]+>, wyrażenie: <[\\w+]{1, 2}>.
W sumie na chwilę obecną to tylko potrzebuję pozamieniać te tagi na przecinki, ale to już wiem jak zrobić. Chciałem tylko wiedzieć, jak się posługiwać iterator-ami, ale widzę, że to jest podobne właśnie do vector-ów.
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

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