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 » poniedziałek, 6 czerwca 2011, 11:23

Cyfrowy Baron napisał(a):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 /


Już wiem! Samo wyszło. Używając wyrażenia <.[a-z]> dopuszczam tylko użycie między < i > liter, więc kreska nie jest możliwa, ale wydawało mi się, że kropka dopuszcza użycie tylko jednego znaku, więc wyrażenie <.[a-z]> powinno wiec dopuszczać np. tylko <b> lub <r>, a tymczasem dopuszcza <br> - dlaczego?
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, 11:25

Tak na przykład: <[a-zA-Z]{2,2}>

p.s. zastanawia mnie, dlaczego moje poprzednie wyrażenie Tobie nie działało. Przejrzałem sobie dokumentację boostowego regexa, wyrażenie, które podałem wydaje się poprawne, więc coś musiałeś zrobić nie tak.
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 polymorphism » poniedziałek, 6 czerwca 2011, 11:28

ale wydawało mi się, że kropka dopuszcza użycie tylko jednego znaku, więc wyrażenie <.[a-z]> powinno wiec dopuszczać np. tylko <b> lub <r>, a tymczasem dopuszcza <br> - dlaczego?

Dlatego, że kropka to jeden znak, a [a-z] to drugi (tylko litery).
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:31

Już do tego doszedłem. Kropka nie odnosi się do [a-z] lecz sama w sobie dopuszcza jeden znak i nie koniecznie literę, czyli mam tam dwa znaki jeden dowolny i jedna litera z przedziału a-z. by wyeliminować możliwość wystąpienia znaku nie będącego literą powinienem ułożyć wyrażenie tak <[a-z][a-z]> lub nawet tak: <[a-z]?[a-z]>.

Jak ułożyć wyrażenie, by dopuszczać wystąpienie <br>, ale nie koniecznie musi wystąpić.
Ułożyłem to tak:

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


Tylko, że mam teraz dodatkowy blok, a chciałbym jak wcześniej mieć tylko potrzebne bloki, czyli bez tagó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 Cyfrowy Baron » poniedziałek, 6 czerwca 2011, 11:40

polymorphism napisał(a):p.s. zastanawia mnie, dlaczego moje poprzednie wyrażenie Tobie nie działało.


Bo w moim zdaniu zabrakło końcówki </koniec>, ale jak dodałem to Twoje wyrażenie działa poprawnie.

Tego nie rozumiem {2,2}

Poprawiłem Toje wyrażenie:

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


Tylko czym się różni ([^<>]*) od (.*).

Nie do końca rozumiem użycie ^ i $

Ja stworzyć wyrażenie by działało prawidłowo nawet gdy jakiś tag nie wystąpi w zdaniu. Wiem, że można podzielić na grupy i dodać znak zapytania przed grupą, ale jak to zrobić bez umieszczania tych tagów w grupach? Czy to możliwe?

W powyższym wyrażeniu wiem ile grup wyrazów występuje w zdaniu, więc dziele wyrażenie na grupy, ale jak zrobić to nie wiedząc ile tych tagów tam jest?!
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, 11:56

Bo w moim zdaniu zabrakło końcówki </koniec>, ale jak dodałem to Twoje wyrażenie działa poprawnie.

Czyli błąd był po Twojej stronie.

Jak ułożyć wyrażenie, by dopuszczać wystąpienie <br>, ale nie koniecznie musi wystąpić.

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

Tylko czym się różni ([^<>]*) od (.*).

W pierwszym przypadku chodzi o grupę wszystkich znaków (lub żadnego) z wyjątkiem < i >, w drugim - grupę wszystkich znaków (lub żadnego).

Tego nie rozumiem {2,2}

Oznacza to tyle, że wcześniejsze wyrażenie musi wystąpić 2 razy, w tym przypadku chodzi o litery.

Nie do końca rozumiem użycie ^ i $

^ oznacza początek linii, a $ jej koniec. Np. dla wyrażenia ^aaa.*zzz$ wszystkie linie zaczynające się od trzech liter 'a' i kończące się trzema literami 'z' będą pasować do wzorca.

    aaabcdefzzz - pasuje
    aaabcdefz - nie pasuje
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Cyfrowy Baron
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, 12:31

polymorphism napisał(a):Oznacza to tyle, że wcześniejsze wyrażenie musi wystąpić 2 razy, w tym przypadku chodzi o litery.


A możesz to wyjaśnić jeszcze jaśniej. Co jeżeli dam {2, 1} lub {1, 2}?

polymorphism napisał(a):<[a-z ]+>(.*)?(?:<[a-z]{2,2}>){0,1}(.*)<\/[a-z ]+>


Znak zapytania to rozumiem ale co oznacza ten dwukropek no i {0, 1}, umieściłeś ten tag w nawiasach, więc tworzy grupę, czy nie dałoby się tak by nie tworzył grupy coś w stylu: ?:<[a-z]{2,2}>{0, 1}, bo z grupą to będę miał w wynikach parsowania. Po co to {0, 1}?

polymorphism napisał(a):W pierwszym przypadku chodzi o grupę wszystkich znaków (lub żadnego) z wyjątkiem < i >, w drugim - grupę wszystkich znaków (lub żadnego).


Drugie to rozumiem, ale jak wykluczasz < i >? Czy samo umieszczenie tego w nawiasach kwadratowych już to wyklucza? Po co ten daszek ^
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, 12:58

Co jeżeli dam {2, 1} lub {1, 2}?

W pierwszym przypadku masz błąd... hmm... logiczny. W tym wyrażeniu określasz ilość wystąpień od-do. Czyli wyrażenie {m,n} oznacza, że coś tam musi wystąpić co najmniej m razy, ale nie więcej niż n

Znak zapytania to rozumiem ale co oznacza ten dwukropek

Znak zapytania w tym kontekście oznacza coś innego, w zasadzie jest częścią innego wyrażenia: (?:<regex>) - tworzy grupę, która nie wchodzi w skład wyników. Przykład: dla wyrażenia (.)(?:b)(.) i tekstu 'abc' na wyjściu będziesz miał:

  • grupa 1 - 'a'
  • grupa 2 - 'c'

Czy samo umieszczenie tego w nawiasach kwadratowych już to wyklucza?

Oczywiście, że nie. Dlaczego miałoby tak być?

Po co ten daszek ^

Daszek wewnątrz [] tworzy negację. Przykład: [^a-z] oznacza każdy znak z wyjątkiem litery.
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, 13:32

polymorphism napisał(a):Oczywiście, że nie. Dlaczego miałoby tak być?


Bo napisałeś:

polymorphism napisał(a):W pierwszym przypadku chodzi o grupę wszystkich znaków (lub żadnego) z wyjątkiem < i >,


Napisałeś z wyjątkiem < i >, więc sądziłem, że nawiasy je wykluczają z wyrażenia, ale jak rozumiem to ^ wewnątrz [] je wyklucza, czyli znak ^ znaczy co innego niż poza tymi nawiasami?!
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, 14:30

Tak.
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, 19:35

A wiesz może jak zrobić, gdy liczba tagów <br> nie jest z góry określona i znana, czyli może być różna. Tagi początkowy i końcowy są jak wcześniej.
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, 20:16

Jeśli chodzi Ci o dynamiczną liczbę grup, ustalaną na podstawie przeszukiwanego tekstu, to tak chyba nie da się zrobić.
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++ » wtorek, 7 czerwca 2011, 13:30

Znak kropki jeśli ma być traktowany jako znak musi być poprzedzony \. inaczej "kropka" w wyrażeniu regularnym oznacza dowolny znak.
---------
KOD cpp:     UKRYJ  
char* input_string = "<autorek>Temat wiadomości i jakieś inne dane.<br>druga część wiadomości</koniec>";
// lub  char* input_string = "<autorek>Temat wiadomości i jakieś inne dane.<br />druga część wiadomości</koniec>";

regex exrp("<\\w+>(.*?)<[br /]+>(.*?)</\\w+>"); /* co powinno być tutaj */
match_results<const char*> what;
regex_search(  input_string, what, exrp );
//      string dane =  (string) what[0]  + " :: " +  (string) what[1]   + " :: " +  (string) what[2] ;
Memo1->Lines->Add(((string)what[1]).c_str());
Memo1->Lines->Add(((string)what[2]).c_str());

OUT:
Temat wiadomości i jakieś inne dane.
druga część wiadomości
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 » wtorek, 7 czerwca 2011, 16:37

Do Darek_c++: Problem już dawno rozwiązałem. Co do tej kropki i ogólnie metatagów traktowanych jako znaki specjalne i znaki zwykłe to wiem. Nie bardzo rozumiem czego tyczy się Twoja uwaga odnośnie kropki. Ja nigdzie tego problemu nie poruszałem.

Problem rozwiązał polymorphism wyrażeniem:

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


W Twoim wyrażeniu niezrozumiałe są dla mnie <\\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 Darek_C++ » wtorek, 7 czerwca 2011, 17:13

\\w jest skrótem - klasą zastępująca a-zA-Z0-9_ np: http://pl.wikibooks.org/wiki/Perl/Opis_ ... egularnych, http://www.piotrosz.aspnet.pl/post/Wyra ... gawka.aspx w wyrażeniach regularnych perla
Kropka tyczyła tego zapisu: <[a-z].*>(.*)<.[a-z]>(.*)</?[a-z].*>
---------
Wyrażenie: regex exrp("<[a-z ]+>(.*)?(?:<[a-z]{2,2}>){0,1}(.*)<\/[a-z ]+>"); nie wyodrębnia prawidłowo
OUT:
<autorek>Temat wiadomości i jakieś inne dane.<br>druga część wiadomości</koniec>
Temat wiadomości i jakieś inne dane.<br>druga część wiadomości
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

Poprzednia stronaNastę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 4 gości