CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z regexp

Problem z regexp

dział ogólny

Problem z regexp

Nowy postprzez Pitek » poniedziałek, 14 stycznia 2013, 03:00

Witam!
Mam problem z regular expresion. Mianowicie mam sobie taki pattern : ^(.{3})(\d*:\d*|\d*)(tp|tn) i taki input :
Kod: Zaznacz cały
Pon7:30tp: 7:30

Pon7:30tn: 7:30

Pon11tp: 11

Pon11tn: 11

Pon15tp: 15

Pon15tn: 15

Nie21tp: 21

Nie21tn: 21

Chciałbym teraz dostać wynik po przepuszczeniu tego inputa przez ten pattern i za cholere nie wiem jak... juz troche nad tym siedze.
Wszędzie znajduję jakiekolwiek informacje tylko dla przypadków sprawdzania czy podawany tekst jest wg. jakiego patterna a mnie nie o to chodzi.
Mnie chodzi o coś takiego jak output z danych powyżej jak na stronie http://www.rubular.com
Bardzo proszę o pomoc...
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Problem z regexp

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 stycznia 2013, 09:11

Ja nie zrozumiałem o co tobie chodzi. patern, input, output? Napisz konkretnie co dajesz na wejściu i co chcesz otrzymać po przepuszczeniu przez wyrażenie regularne.
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: Problem z regexp

Nowy postprzez polymorphism » poniedziałek, 14 stycznia 2013, 11:21

Coś w tym stylu:
KOD cpp:     UKRYJ  
TMatchCollection mcol = TRegExp::Matches(Input, L"^(.{3})(\d*:\d*|\d*)(tp|tn)", /* pokombinuj z TRegExOptions */ );

for(int i = 0; i < mcol.Count; ++i)
{
        TMatch m = mcol.Item[i];
       
        ... = m.Groups[0].Value; // tu chyba cały wzór będzie...
        ... = m.Groups[1].Value; // ...a tu już poszczególne grupy
        ... = m.Groups[2].Value;
        ...
}

O to chodzi?
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: Problem z regexp

Nowy postprzez Pitek » poniedziałek, 14 stycznia 2013, 12:40

Dokładnie o to chodzi jednak taki kod :
KOD cpp:     UKRYJ  
String Input = Edit1->Text;
TMatchCollection mcol = TRegEx::Matches(Input, L"^(.{3})(\d*:\d*|\d*)(tp|tn)");

for(int i = 0; i < mcol.Count; ++i)
{
                TMatch m = mcol.Item[i];

                Memo1->Lines->Add(m.Groups[1].Value);
}

Wywala mi taki błąd :

[ilink32 Error] Error: Unresolved external 'System::Regularexpressions::TGroupCollection::operator [](System::Variant)' referenced from C:\USERS\PITEK\DOCUMENTS\RAD STUDIO\PROJECTS\FLOW PARSER\WIN32\RELEASE\UNIT1.OBJ


Nie wiem czemu...
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Problem z regexp

Nowy postprzez polymorphism » poniedziałek, 14 stycznia 2013, 12:55

Też nie wiem, bo według dokumentacji TGroupCollection ma przeciążony operator indeksowania. Może tak spróbuj:
KOD cpp:     UKRYJ  
m.Groups.Item[1].Value
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: Problem z regexp

Nowy postprzez Pitek » poniedziałek, 14 stycznia 2013, 17:31

Dziękuję, teraz się kompiluje ale dla podanych przeze mnie danych kod nic nie zwraca, znaczy Memo jest puste ;/ :?:
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Problem z regexp

Nowy postprzez polymorphism » poniedziałek, 14 stycznia 2013, 20:36

No niestety, tutaj musisz kombinować sam, ewentualnie poprosić kogoś, kto ma C++ Buildera z regexami. Być może problem leży we wzorcu - wyrażenia regularne mogą się nieco różnić składnią w zależności od implementacji. Dlatego zajrzyj do dokumentacji, bo zapewne tam znajdziesz dokładny opis składni.
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: Problem z regexp

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 stycznia 2013, 21:04

Jest puste gdyż coś jest nie tak z wyrażeniem. Na stronie http://www.rubular.com/r/LIEJkGdNbo wpisałem wyrażenie ([a-zA-Z]{3})(\d*:\d*|\d*)(tp|tn) i zostało prawidłowo przetworzone, jednak w programie już nie.
Udało mi się dopiero z takim wyrażeniem: ([a-zA-Z]+)(([0-9]+\d*):([0-9]+\d*)|([0-9]+\d*))(tp|tn).
Cały kod w C++Builder XE2:

KOD cpp:     UKRYJ  
 TRegEx *regex;
 regex = new TRegEx("([a-zA-Z]+)(([0-9]+\d*):([0-9]+\d*)|([0-9]+\d*))(tp|tn)");

 TMatchCollection mcol = regex->Matches( Memo1->Text );

 for(int i = 0; i < mcol.Count; ++i)
 {
                TMatch m = mcol.Item[i];

                Memo2->Lines->Add( m.Groups[1].Value );
                Memo2->Lines->Add( m.Groups[2].Value );
                Memo2->Lines->Add( m.Groups[6].Value );

                Memo2->Lines->Add( "" ); /*spacja*/
 }


Zwróć uwagę na to, że prawidłowe wartości są zwracane przez indeksy 1, 2 i 6.
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: Problem z regexp

Nowy postprzez Pitek » poniedziałek, 14 stycznia 2013, 21:28

Jeeej działa. Tylko jedno zasadnicze pytanie.... Jak Pan doszedł do takiego zapisu tego patterna czym się sugerować ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Problem z regexp

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 stycznia 2013, 22:40

Sugerowałem się oczywiście składnią regex a składnię dobrałem metodą prób i błędów, pobierając po kolei to co potrzebowałem z łańcucha znaków, czyli zacząłem od ([a-zA-Z]+), a potem dodawałem kolejne bloki i sprawdzałem jak to działa.
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: Problem z regexp

Nowy postprzez Pitek » poniedziałek, 14 stycznia 2013, 23:29

Więc ja w podobny sposób ogarnąłem temat. Czytając trochę na ten temat plus rozmawiając z kolegą ze studiów doszedłem do tego ze interpretator RegExp'a z C++ nie obsługuje operatora "." a finalnym (skróconym ale jednoznacznym i rozpoznawalnym przez niego) zapisem jest ^([a-zA-Z]+)([0-9]+\d*:[0-9]+\d*|[0-9]+\d*)(tp|tn).
Bardzo serdecznie dziękuję Wam za pomoc.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Chrome

Re: Problem z regexp

Nowy postprzez Cyfrowy Baron » wtorek, 15 stycznia 2013, 05:50

U mnie z tym znakiem ^ kod nie jest prawidłowo parsowany.
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: Problem z regexp

Nowy postprzez polymorphism » wtorek, 15 stycznia 2013, 12:14

pitek3010 napisał(a):Czytając trochę na ten temat plus rozmawiając z kolegą ze studiów doszedłem do tego ze interpretator RegExp'a z C++ nie obsługuje operatora "." (...)

Te "RegExp z C++" to dopiero od standardu z 2011 roku, a tutaj mowa o wyrażeniach z VCL-a. W dokumentacji TRegEx jest napisane, że użyta została biblioteka PCRE (Perl Compatible Regular Expressions). Wystarczy zajrzeć do dokumentacji tej biblioteki (a raczej języka Perl), żeby zobaczyć jaka jest składnia (link). Jeśli chodzi o kropkę, nie ma opcji, żeby nie była obsługiwana, bo we wszystkich najpopularniejszych dialektach regexów ta kropka jest i pełni tę samą funkcję.

Spróbuj z takim wzorcem: /^(.{3})(\d*:\d*|\d*)(tp|tn)/
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: Problem z regexp

Nowy postprzez Cyfrowy Baron » wtorek, 15 stycznia 2013, 16:33

polymorphism napisał(a):Spróbuj z takim wzorcem: /^(.{3})(\d*:\d*|\d*)(tp|tn)/


U mnie to nie działa. W ogóle nie ma reakcji na kropkę. Jeżeli jednak dam tylko takie wyrażenie (.{3}), to czyta mi trzy pierwsze znaki. Jednak tak skonstruowane wyrażenie (.{3})(.+\d*:.+\d*|.+\d*)(tp|tn) parsuje prawidłowo na indeksach 1,2,3. Jeżeli dam na początku wyrażenia znak ^ to parsuje mi tylko pierwszą linię z listy, a nie wszystkie elementy.

Dlaczego nie czyta prawidłowo samego \d*
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: Problem z regexp

Nowy postprzez Cyfrowy Baron » wtorek, 15 stycznia 2013, 21:29

W końcu mnie olśniło. Wpisując wyrażenie w kodzie programu należy poprzedzić kreskę ułamkową odwróconą taka samą kreską, czyli wyrażenie powinno mieć taką postać:

KOD text:     UKRYJ  
(.{3})(\\d*:\\d*|\\d*)(tp|tn)


I w ten sposób to działa. Co do daszka ^ to tak jak napisałem 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

Następna 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 5 gości