CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Regular Expressions

Regular Expressions

dział ogólny

Regular Expressions

Nowy postprzez Slynx » czwartek, 19 maja 2011, 09:51

Mam drobny problem z ogarnięciem tego wszystkiego. Na razie starałem się napisać wyłapywanie stringu pomiędzu dwoma const-ami, tj.
KOD cpp:     UKRYJ  
Regex^ rgx = gcnew Regex("<a>[\\.+]<b>");
//w tym wypadku dowolnych znaków pomiędzy "a" i "b";
 

Tak... ale nie działa jak należy. Ktoś może pokazać jak wyglądałoby to poprawnie ?
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 » czwartek, 19 maja 2011, 10:07

Z jakiej biblioteki pochodzi Regex?
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 » czwartek, 19 maja 2011, 10:11

//w tym wypadku dowolnych znaków pomiędzy "a" i "b";

Pomiędzy 'a' i 'b', czy '<a>' i '<b>'? Slynx, zwracaj uwagę na takie pierdoły, bo przez nie Twoje posty są niejasne, mało zrozumiałe, nieprecyzyjne.

Spróbuj tak: <a>(.+)<b>


Z jakiej biblioteki pochodzi Regex?

Slynx + gcnew tylko jedno oznacza - biblioteka .NET framework ;)
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 » czwartek, 19 maja 2011, 10:22

polymorphism napisał(a):Slynx + gcnew tylko jedno oznacza - biblioteka .NET framework ;)


Znalazłem to już u siebie w bibliotekach 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: Regular Expressions

Nowy postprzez Slynx » czwartek, 19 maja 2011, 11:19

To nie Boosty, poza tym, to nie ma znaczenia, pytałem o samo wyrażenie. I polymorphism, wiem co napisałem. Sprawdzałem, jak to wygląda i że wyrażenia stałe powinno się zapisywać między znakami "<" i ">". Tym razem to Ty przesadzasz w drugą stronę z niejasnością postów.
Zaraz zobaczę czy będzie działać.

Jednak nie działa. Całość wygląda tak, bo może gdzie indziej robię błąd (ale dla prostych wyrażeń działa:/)
KOD cpp:     UKRYJ  
                                 Regex^ rgx = gcnew Regex("<a>(.+)<b>");

                                       MatchCollection ^matches = rgx->Matches(tekst);                         
                                           MessageBox::Show(matches->Count.ToString());
 

I matches->Count zwraca 0.
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, 11:46

Sprawdzałem, jak to wygląda i że wyrażenia stałe powinno się zapisywać między znakami "<" i ">".

A skąd Ty to wziąłeś? Wprawdzie jest wiele "dialektów" wyrażeń regex'owych, ale z czymś takim to się nie spotkałem.

Jednak nie działa.

No jeśli to ma być dla 'a' i 'b', to wtedy pousuwaj nawiasy <> z wyrażenia.
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 » czwartek, 19 maja 2011, 11:56

Slynx napisał(a):To nie Boosty,


U mnie występuje tylko w bibliotekach BOOST, ale nie wiem jak tego używać, gdyż nie dołączono dokumentacji.
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 Slynx » czwartek, 19 maja 2011, 12:03

Ok, to był prosty przykład, a jak mam const-a ze spacjami lub znakami "<" na początku ? To się bierze w jakiś nawias czy coś ?
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, 12:19

Raczej nie. Może podaj jakiś sensowny przykład.
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, 12:47

Kod: Zaznacz cały
Regex("<input type=\"checkbox\"(.+)td class=\"mail_size\">")

<input type=\"checkbox\" i td class=\"mail_size\"> są w wyrażeniu const-ami.

P.S.
Dodałem inną funkcje szyfrująca żeby zejść z tych 6 sekund. Aktualnie czas dla samego szyfrowania (20000 wywołań) dał zysk ok. 18,5 tys % (~0,005 czasu wykonywania). Jest jednak pewien problem. Szyfrowanie "wymagało" zamiany znaków do Unicode. Czy jeśli teraz wyślę taki zaszyfrowane coś w kodowaniu Unicode na stronę obsługującą, np. UTF7... no właśnie, co się stanie ? Chodzi mi o to czy gdzieś przy jakichś konwersjach nie pogubi danych, czy po prostu zamieni to sobie na nierozpoznawalne znaki, ale dane wciąż tam będą. Jak jest utrata, to spróbuję z tym jeszcze pokombinować.
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, 13:09

<input type=\"checkbox\" i td class=\"mail_size\"> są w wyrażeniu const-ami.

No a przykładowy tekst z tym tagiem, na którym nie działa, gdzie jest? U mnie ta forma wyrażenia działa, choć nie wiem co to jest to 'td'.
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, 13:32

td jest częścią drugiego ciągu znaków, dlatego mówiłem, że to powinno być w jakiś nawias czy coś by wyrażenie może być błędnie odczytane.

Sprawdź na tym co jest w załączniku. Powinno dać Ci wynik ok 100 wystąpień.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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, 16:00

Dobra, poprzedni post wywaliłem, bo już nie ma znaczenia ;)

Sprawdź to: <input type="checkbox"([\s\S]+?)<td class="mail_size">

U mnie 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 Slynx » czwartek, 19 maja 2011, 16:11

... bo użyłeś złego wyrażenia. Przy zastosowaniu tego <input type=\"checkbox\" name= i użyciu funkcji split wypełni tablicę odpowiednimi wiadomościami (oprócz 1 i ostatniej). Wtedy będzie ciął tekst według tego wyrażenia. Teraz wystarczy usunąć pierwszy i ostatni element, wrzucić w for each i przejechać po kolejnych rekordach. Powinno być znacznie szybciej.
Thx
A ja odpisałem na poprzedni;p
No dobra, Twoje działa lepiej niż moje ;;p

Jeszcze chyba będę miał jedno pytanie, bo wiem co zrobić by to wyrażenie przestało dobrze działać ; p Chcę dodać pewne usprawnienie do funkcji z wykorzystaniem w.r

Aha i jeszcze coś, wszystkie znaki typu /s czy /S (itp) trzeba zamieniać na //s i //S, bo wtedy wiadomo jak to traktuje.

//
Ok, nie udało mi się udowodnić, że nie będzie działać, bo działa. Mam jeszcze pytanie, np.
Co trzeba dorzucić by np. dla takiego tekstu

Kod: Zaznacz cały
String ^ aaa = "\"a\"";

wyrzucał wynik
Kod: Zaznacz cały
a

a nie
Kod: Zaznacz cały
"a"

czyli wyciąć te znaki, które są wyznacznikami.
wyrażenie
Kod: Zaznacz cały
Regex("\"([\\s\\S]+?)\"");
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:03

"([^"]*)"

Proponuję zajrzeć do jakiegoś opisu wyrażeń regularnych, czegoś się nauczysz.

p.s. i nie dopisuj pytań do posta po jakiejś dłuższej przerwie, bo nie ma wtedy powiadomienia. Nie ma powiadomienia, nie ma odpowiedzi.
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

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 9 gości