Regular Expressions

dział ogólny

Re: Regular Expressions

Nowy postprzez Slynx » czwartek, 19 maja 2011, 20:14

polymorphism, a Ty z czego się uczyłeś ? Jakaś książka, dokumentacja czy stronka ?
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 » czwartek, 19 maja 2011, 20:20

Jakiekolwiek źródło informacji o wyrażeniach + eksperymentowanie.
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 » czwartek, 19 maja 2011, 22:28

Nie jestem w 100 % pewnien, ale chyba podałeś mi złe wyrażenie, tj. Nadaje się tylko do tego konkretnego przykładu (oczywiście wymieniając znak " na odpowiedni). Nie będę starał się na siłę udowodnić, że gdzieś się sypnie, ale jeśli wewnątrz tego wyrażenia które chcemy wyciąć również znajduje się tekst, który jest wyznacznikiem początkowym ? Trochę pokombinowałem i zrobiłem własne

Kod: Zaznacz cały
(?<=wyr1).*(?=wyr2)

// poprawka
Kod: Zaznacz cały
(?<=wyr1)(?s:.*)(?=wyr2>)

Teraz chyba już wyłapie wszystko, łącznie ze znakami nieformatowalnymi

i chyba będzie działać poprawnie.
Ty już pewnie masz to i tak w małym paluszku, ale dla innych - RegexBuddy. Masa przydatnych narzędzi. 10 minut pracy i zrobiłem to co chciałem. Masa przykładów do analizy, tester, debugger, analizator, dokładne wyjaśnienia, wstawianie... wszystko.
.
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 » piątek, 20 maja 2011, 00:38

Mam problem z jeszcze jednym wyrażeniem, bo normalnie jest poprawne, a po uruchomieniu nie działa
Kod: Zaznacz cały
(?<=<a href=\"/.cmd)([\\s\\S]+?)(?=\">»</a>)"

w
Kod: Zaznacz cały
</option></select>  <a href="/?cmd=list&amp;fld=0&amp;offset=100&amp;sortmet=date&amp;sortdir=desc">»</a></span>

i powinno dać wynik
Kod: Zaznacz cały
=list&amp;fld=0&amp;offset=100&amp;sortmet=date&amp;sortdir=desc

z pewnością chodzi o kropkę , może traktuje ją jako zwykły znak (wstawiłem ją, bo "?" też nie akceptował)
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 » piątek, 20 maja 2011, 08:42

Slynx napisał(a):i powinno dać wynik


U mnie właśnie taki wynik daje:

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

using namespace boost;
using namespace std;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 string input_string = "</option></select>  <a href=\"/?cmd=list&amp;fld=0&amp;offset=100&amp;sortmet=date&amp;sortdir=desc\">»</a></span>";

 regex exrp( "(?<=<a href=\"/.cmd)([\\s\\S]+?)(?=\">»</a>)" );
 match_results<string::const_iterator> what;

 string bu;

 if( regex_search( input_string, what, exrp ) )
 {
  string base_url( what[1].first, what[1].second );

  bu = base_url;
 }

 Edit1->Text = String( bu.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: Regular Expressions

Nowy postprzez polymorphism » piątek, 20 maja 2011, 09:45

<a href=\"[^\s]+?cmd=([^\s]+?)\">»<\/a>
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 Cyfrowy Baron » piątek, 20 maja 2011, 09:57

Dla:

polymorphism napisał(a):<a href=\"[^\s]+?cmd=([^\s]+?)\">»<\/a>


u mnie niczego nie zwraca.
Nie rozumiem tych 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: Regular Expressions

Nowy postprzez polymorphism » piątek, 20 maja 2011, 10:27

A poprawiłeś backslashe? Na większości online'owych testerach to wyrażenie działa.
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 Cyfrowy Baron » piątek, 20 maja 2011, 10:32

Nie wiem o czym piszesz. Ja się nie znam na regex-ach. To pierwszy kod, który zastosowałem, a i to znalazłem w sieci. Nie wiem jak się pobiera dane z regex oraz nie rozumiem tej składni, którą podałeś. Gdybyś mógł to wyjaśnić choć trochę na prostych przykładach, ale z wykorzystaniem biblioteki boost?! :mrgreen:
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 » piątek, 20 maja 2011, 10:35

Chodzi mi o to, czy pamiętałeś o tym, żeby pojedynczy \ zamienić na \\.
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 Corvis » piątek, 20 maja 2011, 10:46

Mały OFF TOPIC.
W C++ i Delphi od wersji XE dodano moduł RegularExpressions gdzie znacznie uproszczono obsługę wyrażeń reguralnych.
Mały przykładzik w Delphi:

http://www.andreanolanusse.com/blogen/using-regular-expressions-to-validate-ip-address-with-delphi-xe/
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows XPFirefox

Re: Regular Expressions

Nowy postprzez Cyfrowy Baron » piątek, 20 maja 2011, 10:49

Po zmianie na podwójne działa, ale poprzednio też działało, poza tym jak zrobię tak: "<a href=\"[^\\s]+?cmd=([^\\s]+?)\">»</a>" zamiast <\/a>, to też działa.

Możesz wyjaśnić znaczenie tej składni, bo nic z niej nie rozumiem?
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 » piątek, 20 maja 2011, 11:44

<a href=\" - tu wiadomo.
[^\\s]+? - ciąg wszystkich znaków z wyjątkiem białych. Ciąg kończy się w momencie pierwszego wystąpienia następnego wzorca, czyli:
cmd= - tu wiadomo.
([^\\s]+?) - podobnie jak wyżej, tyle że wzór wyodrębniony jest w grupę. Innymi słowy masz tu to, czego szukasz.
\">»</a>" - tu wiadomo.
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 » piątek, 20 maja 2011, 15:11

C.Baronie, musisz zrobumieć, że każda (no może nie każda, ale większość) bibliotek do obsługi wyrażeń ma własne charakterystyczne metaznaki i sposoby zapisu. U mnie w edytorze też ten przykład działał, ale po przeniesieniu do kodu z wykorzystaniem .Net nie działało, właśnie dlatego, że są drobne zmiany w sposobie zapisywania niektórych metaznaków. To jest pewnie gdzieś (msdn) opisane, ale nie chciało mi się już grzebać i pomyślałem, że polymorphism będzie wiedział.
C.Baronie, jak nie rozumiesz tego - RegexBuddy, tam masz wszystko, zapewniam Cię, po 15 minutach pracy zrozumiesz wszystko tak jak ja, bo przy pisaniu tego tematu nie miałem o tym pojęcia.

Zaraz sprawdzę to wyrażenie. Dopiero wróciłem z matury... zdałem ;)

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.
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 » piątek, 20 maja 2011, 16:12

Ok, nie działało mi, ale już wiem dlaczego. Okazało się, że po wczytaniu za pomocą streamreadera zamienił ten znak na innym (widocznie nie występował w tym kodowaniu). Wstawiłem tam kropkę i jest wszystko ok.
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 stronaNastę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 9 gości