Posty bez odpowiedzi |oraz Aktywne tematy Dzisiaj jest 2024-11-23, 02:26x



Odpowiedz w temacie  [ Posty: 15 ] 
Wyrażenia regularne 
Autor Wiadomość

Rejestracja: 2008-07-11, 13:33
Posty: 78
Post Wyrażenia regularne
Następująca sytuacja spędza mi ostatnio sen z oczu :)
Strasznie ogólnikowo są potraktowane wyrażenia regularne w helpie. Nie za bardzo jestem w stanie zrozumiec ich działanie.
Mój problem polega na tym, że chcę wyciągnąć okreslony, powtarzający się ciąg znaków i zapisać do odpowiednich zmiennych.
Mam np. następujacy tekst w zmiennej Buf:

"ble ble ble, tekst nr 1 do wyrzucenia, ble ble ble, tekst nr 2 do wyrzucenia, ble ble ble, tekst nr 3 do wyrzucenia"

Chodzi o uzyskanie takiego efektu, abym pod zmiennymi uzyskał nastepujące wartości:
zm1: "tekst nr 1 do wyrzucenia "
zm2: "tekst nr 2 do wyrzucenia"
zm3: "tekst nr 3 do wyrzucenia"

Kod:
buf="ble ble ble, tekst nr 1 do wyrzucenia, ble ble ble, tekst nr 2 do wyrzucenia, ble ble ble, tekst nr 3 do wyrzucenia"
String zm1
String zm2
String zm3

   Zm1 = Find Regular "(tekst*do wyrzucenia)"
   Print "Zm1: ";Zm1;LF;

   Zm2 = Find Regular "(tekst*do wyrzucenia)"
   Print "Zm2: ";Zm2;LF;

   Zm3 = Find Regular "(tekst*do wyrzucenia)"
   Print "Zm3: ";Zm3;LF;


2009-07-03, 13:58
Wyświetl profil
Autor Wiadomość
 


Ekspert
Ekspert
Awatar użytkownika

Rejestracja: 2008-04-18, 18:52
Posty: 5169
Pomógł: 59
Post 
A moze prosciej popatrzec w inych raportach - wszedzie gdzie jest uzywane polecnie find izmienna buf - mozna latwo obejrzec i sie domyslec jak to dziala :)


2009-07-03, 14:25
Wyświetl profil

Rejestracja: 2008-07-11, 13:33
Posty: 78
Post 
Jestem już po lekturze helpa z wyrażeń regularnych, a także przeglądałem raporty pod tym kątem.
Nie wiem, może dla szanownych uczestników forum nie jest to rzecz skomplikowana, jednak ja jako początkujący AMBasicowiec mam z tym spory problem.
Próbowałem już różnych rozwiązań, lecz za każdym razem program potrafi wyszukać tylko pierwsze wyrażenie w zmiennej buf, natomiast reszta jest pomijana.

Liczyłem, że uzyskam (zresztą jak już nie raz na tym forum) jakąś konktretniejszą pomoc. :-?


2009-07-03, 15:08
Wyświetl profil
Ekspert
Ekspert
Awatar użytkownika

Rejestracja: 2008-04-18, 18:52
Posty: 5169
Pomógł: 59
Post 
program wyszukuje dowolne kolejne wyrazenie
uzyj po prostu
Regular 0
Regular 1
Regular 2 itp

np jesli dla daty buf="20070801" uzyjesz wyrazenie regularnego {????}{??}{??}
to regular 1 bedzie 2007 reg2 08 reg3 02 itp

szukaj w helpach do starszych wersji 2006 np tam to lepiej bylo opisane :)


2009-07-03, 15:33
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2007-11-16, 15:08
Posty: 4000
Pomógł: 448
Post 
To powinno okazać się pomocne

Kod:
//----------------------------------------------------------
string Sub GetElem(string sAll,int ElNum)
//----------------------------------------------------------     
            int iLicz
            buf = sAll + ","
           
            while find regular "{*}/,-"
                        iLicz += 1
                        if iLicz == ElNum then GetElem = regular 1       
            wend

endsub

string s ="ble ble ble, tekst nr 1 do wyrzucenia, ble ble ble, tekst nr 2 do wyrzucenia, ble ble ble, tekst nr 3 do wyrzucenia"

print GetElem(s,1) + lf
print GetElem(s,2) + lf
print GetElem(s,3) + lf
print GetElem(s,4) + lf
print GetElem(s,5) + lf
print GetElem(s,6) + lf

_________________
Skontaktuj się z Ekspertem | Zamów dodatek

tel. 22 7 538 538
ekspert@mojaSymfonia.pl
http://www.mojaSymfonia.pl


2009-07-03, 22:35
Wyświetl profil
Awatar użytkownika

Rejestracja: 2008-12-03, 21:11
Posty: 276
Pomógł: 2
Post 
wrob pisze:
program wyszukuje dowolne kolejne wyrazenie
uzyj po prostu
Regular 0
Regular 1
Regular 2 itp

np jesli dla daty buf="20070801" uzyjesz wyrazenie regularnego {????}{??}{??}
to regular 1 bedzie 2007 reg2 08 reg3 02 itp



Witam,

Wrob, wg mnie to kiepski pomysł, bo co się stanie jak wystąpień tekstu będzie 15-ście i więcej - nie zadziała, regularów masz chyba 10 (od 0 do 9) więc to się wywali wcześniej czy później...

Ja napisał bym to tak ;-)

Kod:
buf="ble ble ble, tekst nr 1 do wyrzucenia, ble ble ble, tekst nr 2 do wyrzucenia, ble ble ble, tekst nr 3 do wyrzucenia"
String zm(1)
int i

While Find Regular "(tekst*do wyrzucenia)"
   i += 1
   if i > Size(zm) then Grow zm, 1
   zm(i) = Delete Regular "(tekst*do wyrzucenia)"
   print zm(i) + LF
Wend


Pozdro

Misiek


2009-07-03, 22:40
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2008-04-07, 13:26
Posty: 208
Pomógł: 2
Post 
ANO STARSZE HELPY PISAŁY TROCHĘ WIĘCEJ NA TEN TEMAT
Cytuj:
Wyrażenia regularne powstały po to, by móc wyszukać w danym tekście nie tylko konkretne słowo bądź frazę, ale fragment, który można by określić na zasadach ogólniejszych np. dowolną liczbę bądź np. słowo zaczynające się dużą literą itp.

W dalszej części tego dokumentu zamiast używania zwrotu "szukanie wyrażenia regularnego" będzie używany zwrot "dopasowywanie wyrażenia regularnego" gdyż dokładniej opisuje on sposób użycia wyrażenia regularnego.

W rzeczywistości mamy bowiem do czynienia z dopasowaniem wzoru jakim jest wyrażenie regularne do przetwarzanego tekstu.

Istnieje wiele konkretnych realizacji wyrażeń regularnych. Najbardziej znane to kilka typów UNIX’owych oraz wyrażenia regularne firmy Microsoft oraz Borland używane w ich produktach takich jak edytory tekstu ASCII bądź programy typu GREP.

Realizacja przedstawiona poniżej miała za punkt wyjścia propozycję firmy Microsoft. Obecna jej wersja jest bardzo rozbudowana i zawiera wiele funkcji niedostępnych w innych typach wyrażeń regularnych.

Opis:

Wyrażenie regularne definiowane jest zawsze w postaci tekstu ASCII. Jest to rodzaj krótkiego programu, którego instrukcje powstają dzięki specjalnemu znaczeniu nadanemu niektórym znakom ASCII. Dowolny fragment wyrażenia regularnego można objąć nawiasami (..) tworząc "podwyrażenie", które następnie może stać się argumentem dla innego wyrażenia. W poniższym opisie takie "podwyrażenia" prezentowane są w postaci dużej litery X.

Znaki specjalne występujące w wyrażeniach regularnych:

/ ? * [ ] { } ( ) ~ ! + # ^ | & : $ - % < > =



Wyrażenie
Opis

/
Znak odwołujący (escape )

Powoduje odwołanie specjalnego znaczenia następnego znaku.

Przykład:

wyrażenie /? dopasowuje w tekście pojedynczy znak ?

wyrażenie // dopasowuje w tekście pojedynczy znak /

?
Jeden znak

Dopasowuje dokładnie jeden dowolny znak. Skrót wyrażenia [%00-%ff]

Przykład:wyrażenie a?b dopasowuje zarówno tekst axb jak i tekst np. aBb nie dopasowuje natomiast tekstu ab oraz aaab

*
Dowolny znak (wildcard )

Dopasowuje 0 lub więcej znaków. Skrót wyrażenia ?+

Przykład:wyrażenie a*b dopasowuje zarówno tekst ab jak i tekst aBb oraz aaab

^
Początek tekstu.

Dopasowanie następuje tylko na początku tekstu.

Przykład:

wyrażenie ^KTO dopasowuje słowo KTO tylko wtedy, gdy znajduje się ono na początku tekstu, nigdy nie dopasuje więc tekstu aKTO

$
Koniec tekstu

Dopasowanie następuje tylko na końcu tekstu.

Przykład:

wyrażenie KTO$ dopasowuje słowo KTO tylko wtedy, gdy znajduje się ono na samym końcu tekstu, nigdy nie dopasuje więc tekstu KTOa

[klasa]
Klasa znakowa.

Dopasowuje dokładnie jeden dowolny znak ze znaków należących do klasy. Do określenia zakresu znaków można użyć znaku - (kolejność wg. ASCII)

Przykład:

wyrażenie [a-zA-Z0-9] dopasowuje dowolną literę lub cyfrę

wyrażenie [abc] dopasowuje znak a lub b lub c

[~klasa]
NIE klasa znakowa.

Dopasowuje dokładnie jeden dowolny znak ze znaków nie należących do klasy. Do określenia zakresu znaków można użyć znaku - (kolejność wg. ASCII)

Przykład:

wyrażenie [~a-zA-Z0-9] dopasowuje wszystkie znaki oprócz liter i cyfr

wyrażenie [~abc] dopasowuje wszystkie znaki oprócz znaków a , b , c

X+
Dopasowanie minimalne

Dopasowuje 0 lub więcej powtórzeń wyrażenia regularnego X

Przykład:

wyrażenie ba+b dopasowuje baaab, bab i bb

wyrażenie b(a?)+b dopasowuje baxayb, babb i bb

X++
Dopasowanie minimalne plus

Dopasowuje 1 lub więcej powtórzeń wyrażenia regularnego X (skrót wyrażenia XX+)

Przykład:

wyrażenie ba++b dopasowuje baaab, bab ale nie dopasowuje bb

wyrażenie b(a?)++b dopasowuje baxayb, babb ale nie bb

X#
Dopasowanie maksymalne

Dopasowuje 0 lub więcej powtórzeń wyrażenia regularnego X

Bardzo podobne do X+ z wyjątkiem metody dopasowania

Przykład:

wyrażenie bca+ w tekście bcaaa dopasowuje bc

wyrażenie bca# w tekście bcaaa dopasowuje bcaaa

natomiast zarówno wyrażenie ba+c jak i ba#c dopasowują teksty bc, bac i baaac

X##
Dopasowanie maksymalne plus

Dopasowuje 1 lub więcej powtórzeń wyrażenia regularnego X (skrót wyrażenia XX#)

Bardzo podobne do X++ z wyjątkiem metody dopasowania

Przykład:

wyrażenie bca++ w tekście bcaaa dopasowuje bca

wyrażenie bca## w tekście bcaaa dopasowuje bcaaa

natomiast zarówno wyrażenie ba++c jak i ba##c dopasowują teksty bac i baaac

X1|..|Xn
Alternatywa (suma logiczna)

Dopasowuje wyrażenie X1 lub .. lub Xn. Dopasowuje kolejne wyrażenia właśnie w takiej kolejności, przełącza się z Xi na Xi+1 tylko wtedy gdy reszta wyrażenia nie może się dopasować

Przykład:

wyrażenie (a)|(bbb)|(cc)d dopasowuje zarówno ad, bbbd jak i ccd

wyrażenie (abc)|()d dopasowuje zarówno abcd i d

X1&..&Xn
Koniunkcja (iloczyn logiczny)

Dopasowanie tego wyrażenia występuje tylko wtedy, gdy wszystkie wyrażenia Xi dopasowują się.

O ostatecznym zakresie dopasowania decyduje ostatnie wyrażenie koniunkcji Xn.

Przykład:

w tekście ADCHJKV wyrażenie (*K)&(*C)? dopasowuje ADCH

natomiast wyrażenie (*C)&(*K)? dopasowuje ADCHJKV

~X
NIE wyrażenie.

Dopasowanie występuje tylko wtedy gdy wyrażenie X nie może się dopasować.

Przykład:

wyrażenie ^~((IF)|(WHILE))*$ dopasowuje wszystkie teksty nie zaczynające się od słów IF lub WHILE

X^n
Wielokrotność wyrażenia.

Dopasowuje dokładnie n kopii wyrażenia X

Przykład:

wyrażenie W^4 dopasowuje WWWW

wyrażenie (a?)^3 dopasowuje afaBa5

:n
Pozycja w tekście

Dopasowanie następuje tylko na n-tej pozycji w tekście (liczone od zera)

Przykład:

wyrażenie :4FAT dopasowuje słowo FAT tylko wtedy gdy zaczyna się ono od 5-tego znaku w tekście np. I’m FAT

X1<>X2
Wyrażenia zbalansowane.

Dopasowanie następuje tylko po natrafieniu na tekst ograniczany zbalansowanymi wyrażeniami regularnymi X1 i X2. X1 musi być różne od X2.

Przykład:

wyrażenie *(/[)<>(/]) dopasowuje w tekście a[cd[]][[f]]df tekst a[cd[]]

:litera
Predefiniowane wyrażenie regularne.

Rodzaj makra. Wyrażenie to jest zastępowane przez wyrażenie predefiniowane. Lista predefiniowanych wyrażeń podana jest w tabeli niżej.

Przykład:

wyrażenie :a rozwijane jest w wyrażenie [a-zA-Z0-9]

x
Znak x

Dopasowuje znak x. Wszystkie znaki specjalne muszą być poprzedzone znakiem anulującym /

Przykład:

Wyrażenie a//b/*c dopasowuje tekst a/b*c

!x
NIE znak x

Dopasowuje wszystkie znaki różne od x. Wszystkie znaki specjalne muszą być poprzedzone znakiem anulującym /.

Przykład:

Wyrażenie !c## w tekście baacac dopasowuje baa

%x
Znak x w postaci heksadecymalnej

Dopasowuje znak o kodzie ASCII podanym po znaku % jako liczba heksadecymalna z zakresu 00 .. ff

Przykład:

Wyrażenie regularne %2e%3D%411 dopasowuje tekst .=A1

Wyrażenie regularne [%80-%ff] dopasowuje jeden dowolny znak ASCII o kodzie z zakresu od 128 do 255 włącznie

{...}
Sekcja - znaczenie specjalne

Nie dopasowuje niczego. Zapamiętuje natomiast początek i koniec tekstu dopasowanego przez wyrażenie regularne zawarte między nawiasami. W wyrażeniu regularnym można wyspecyfikować do 9 sekcji, dostępnych jako sekcje o numerach od 1 do 9. Domyślnie sekcję o numerze 0 stanowi całe wyrażenie regularne.

-
Kursor - znaczenie specjalne

Nie dopasowuje niczego. Zapamiętuje natomiast pozycję w tekście dopasowanym przez wyrażenie regularne, w którym został użyty

$n
Zawartość sekcji n

Zastosowanie tego wyrażenia ma sens tylko w połączeniu z wcześniejszym użyciem sekcji. Dopasowanie następuje tylko wtedy gdy dopasowywany tekst jest równy tekstowi wcześniej dopasowanemu przez wyrażenie sekcji n.

Przykład:

Wyrażenie regularne {[a-z]}/=$1 dopasowuje teksty a=a , b=b ... z=z

=
Rozróżnianie dużych i małych literNie dopasowuje niczego. Służy do przełączania rozróżniania przez wyrażenie regularne dużych i małych liter. Zawsze występuje ze znakiem określającym ściślej rodzaj operacji.

=-
Wyłącza rozróżnianie dużych i małych liter

=+
Włącza rozróżnianie dużych i małych liter

==
Przełącza rozróżnianie dużych i małych liter




Predefiniowane wyrażenia regularne:

:litera
rozwinięcie

:a
[a-zA-Z0-9]znak alfanumeryczny

:b
([ \t\r\n]#)"biały" znak

:c
[a-zA-Z]litera

:d
[0-9]cyfra

:f
(([~ \"[/]:<!>+=;,.]##)|(..)|.)

:h
([0-9a-fA-F]##)liczba heksadecymalna

:i
([a-zA-Z_$][a-zA-Z0-9_$]#)

:n
(+|/-|()([0-9]##.[0-9]#)|([0-9]#.[0-9]##)|([0-9]##))

:p
(([a-zA-Z]/:)|()\\|()(:f(.:f)|()\\)#:f(.:f)|())

:q
((\"~\"#\")|('~'#'))

:r
((/-|())([0-9]##))

:w
([a-zA-Z]##)słowo

:x
([ 0-9A-Za-z]##)

:z
([ 0-9A-Za-z]##)

:A
([/-a-zA-Z0-9]##)

:B
([ \t\r\n]##)

:W
([a-zA-Z_@$][a-zA-Z0-9_@$]#)




Przypadki niespójności opisu:

Jeśli chce się dopasować znak 1 na drugim miejscu w tekście, wówczas nie można użyć wyrażenia :11 gdyż zostanie to potraktowane jako dopasowanie dwunastego miejsca w tekście (liczone od 0). W takich wypadkach można zastosować wyrażenia :1/1 lub :1(1)

Podobny problem związany z wielokrotnością wyrażenia należy rozwiązać identycznie.

Jeśli po znaku ^ nie występuje liczba jest on traktowany jako początek tekstu a nie wielokrotność wyrażenia.

Jeśli po znaku $ nie występuje cyfra jest on traktowany jako koniec tekstu a nie zawartość sekcji wyrażenia.



2009-07-03, 23:05
Wyświetl profil

Rejestracja: 2008-07-11, 13:33
Posty: 78
Post 
Dziekuję za pomoc, własnie o to chodziło :))


2009-07-07, 13:21
Wyświetl profil

Rejestracja: 2008-03-10, 14:01
Posty: 593
Post 
A czy ktoś mądry mi podpowie, czemu poniższy programik nie znajduje mi trzeciego regulara?
(chcę znaleźć części tekstu oddzielone spacjami)

Kod:
buf="111 222 333"     
find regular "{*}/ {*}/ {*}"
string sOpis=regular 1,sWym =regular 2 ,sBig=regular 3
print "1. ";sOpis;lf
print "2. ";sWym;lf
print "3. ";sBig

_________________
zz


2011-12-07, 21:59
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2007-11-16, 15:08
Posty: 4000
Pomógł: 448
Post 
Kod:
buf="111 222 333"     
find regular "^{*} {*} {*}$"
string sOpis=regular 1,sWym =regular 2 ,sBig=regular 3
print "1. ";sOpis;lf
print "2. ";sWym;lf
print "3. ";sBig

_________________
Skontaktuj się z Ekspertem | Zamów dodatek

tel. 22 7 538 538
ekspert@mojaSymfonia.pl
http://www.mojaSymfonia.pl


2011-12-07, 23:02
Wyświetl profil

Rejestracja: 2008-03-10, 14:01
Posty: 593
Post 
THX

_________________
zz


2011-12-08, 00:48
Wyświetl profil

Rejestracja: 2008-03-10, 14:01
Posty: 593
Post Re: Wyrażenia regularne
Mam bład wykonania "REGULAR: została zmieniona wartość bufora roboczego", jeśli moja zmienna składa się tylko z dwóch ciągów, tzn. nie jest
aaa bbb ccc,
ale
aaa bbb.

_________________
zz


2011-12-23, 12:59
Wyświetl profil
Awatar użytkownika

Rejestracja: 2008-12-03, 21:11
Posty: 276
Pomógł: 2
Post Re: Wyrażenia regularne
No fajnie - a który KOD / algorytm stosujesz ?

_________________
Pozdrawiam

Misiek DGTL Rzeszów


2011-12-26, 22:53
Wyświetl profil

Rejestracja: 2008-03-10, 14:01
Posty: 593
Post Re: Wyrażenia regularne
Kod:
buf="111 222 333"     
find regular "^{*} {*} {*}$"
string sOpis=regular 1,sWym =regular 2 ,sBig=regular 3
print "1. ";sOpis;lf
print "2. ";sWym;lf
print "3. ";sBig


i przy trzech ciągach w nazwie jest OK, ale 'w międzyczasie' okazało się, że mogą być 2 lub 3.

_________________
zz


2011-12-27, 08:45
Wyświetl profil
Awatar użytkownika

Rejestracja: 2008-12-03, 21:11
Posty: 276
Pomógł: 2
Post Re: Wyrażenia regularne
OK, a ten mój stosowałeś ? chyba jak dobrze pamiętam obsługuje dowolną ilość wyrażeń...

_________________
Pozdrawiam

Misiek DGTL Rzeszów


2011-12-30, 08:55
Wyświetl profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Odpowiedz w temacie   [ Posty: 15 ] 
   Podobne tematy   Autor   Odpowiedzi   Odsłony   Ostatni post 
Na tym forum nie ma nowych nieprzeczytanych postów. wyrazenia regularne

w Programowanie

elja

1

2540

2011-02-18, 15:28

rafal Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. Wyrażenie regularne

w Programowanie

Vlad Korobka

2

2662

2021-06-21, 16:17

Vlad Korobka Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. Wyrażenie regularne w szablonie importu

w Programowanie

aneta.g

1

2726

2016-02-10, 12:20

Jarek75 Wyświetl najnowszy post



Kto jest online

Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 15 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Przejdź do:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Support forum phpbb by phpBB Assistant