|
Autor |
Wiadomość |
barnie
Ekspert
Rejestracja: 2008-04-07, 13:26 Posty: 208 Pomógł: 2
|
Chyba nie masz racji.
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.
Tekst pochodzi z Dokumentacji producenta
|
2008-06-16, 10:05 |
|
|
Autor |
Wiadomość |
Mix-soft.pl
|
|
|
lofix
Rejestracja: 2007-11-26, 15:19 Posty: 47
|
Widzę teraz że moja euforia nie była uzasadniona,choć dziwnym zbiegiem okoliczności osiągnołem zamierzony efekt ale działało tylko przy odpowiednim ustawieniu cyfr,po zmianie kombinacji-lipa.
|
2008-06-16, 19:27 |
|
|
darek.007
Rejestracja: 2007-12-13, 23:19 Posty: 367 Pomógł: 2
|
Cytuj: if Find Regular (using "{*}/%s{*}",lCase(sCoWyszukac))
Nie wiem jaki efekt chciałeś uzyskać ale ten ukośnik jest rewelacyjny.
Moze Wszyscy, którzy zajmują sie wyrażeniami regularnymi już o tym wiedzieli, ja do tej pory nie.
Jak to zadziałało...
Jak wiemy ukośnik / odwołuje znaczenie znaków specjalnych i w tym przypadku odwołuje znaczenie wszystkich znaków specjalnych umieszczonych w zmiennej sCoWyszukac.
Dzięki temu możemy nie martwiąc sie o to co jest znakiem zpecjalnym a co nie, szukać wszystkiego np. "00-23", "[*]"
Gdyby nie ten magiczny ukośnik takie kombinacje trzebaby było wyszukiwać w nastepujący sposób
"00/-23", "/[/*/]"
mało wyjściowy sposób"
Także generalnie rewelacja...
|
2008-06-17, 08:36 |
|
|
lofix
Rejestracja: 2007-11-26, 15:19 Posty: 47
|
Efekt wyszedł mierny,ale Ja nie o tym...Zastanawiam się jak usprawnić wyszukiwanie modyfikując ten raport w sposób pozwalający wyszukiwać jednocześnie po kodzie towaru,nazwie,oraz notatce.Wydaje się że należy użyć tu polecenia "Setkey"ale jego opis jest słaby cyt. "Polecenie umożliwia wybranie domyślnego klucza, według którego będzie pobrany rekord z bazy danych. Liczba kluczy, ich nazwy oraz segmenty z których się składają zależy od bazy danych, z której pobierany jest rekord. Każda baza danych występująca w programie SYMFONIA ma inną strukturę, a co za tym idzie inny zestaw kluczy."
Nie mogę znaleźć nic o kluczach.Czy mój tok myślenia jest prawidłowy?
|
2008-06-18, 13:58 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
Twoje pytania są zbyt ogólne. Oczekujesz kompleksowych rozwiązań niemałych problemów.
|
2008-06-19, 15:44 |
|
|
darek.007
Rejestracja: 2007-12-13, 23:19 Posty: 367 Pomógł: 2
|
Cytuj: wyszukiwać jednocześnie po kodzie towaru,nazwie,oraz notatce.
tak to tylko w erze
|
2008-06-19, 16:29 |
|
|
lord
Rejestracja: 2010-04-09, 14:47 Posty: 34 Pomógł: 1
|
Witam,
jestem tu nowy więc proszę o wyrozumiałość.
Bardzo przydatny raport - wyszukaj towar po notatce. Mam pytanie, jak zmodyfikowac go aby wyszukiwał tylko po pierwszym wierszu w notatce, a ignorował nastepne ? chodzi mi o to, że dane interesujące mnie są zawarte w pierwszym wierszu notatki, to co pod spodem nieważne. Dzięki. Pozdrawiam.
|
2010-04-09, 14:51 |
|
|
byrusia
Rejestracja: 2009-11-02, 13:05 Posty: 191
|
załóż nowy temat
|
2010-04-09, 15:24 |
|
|
xfr82
Rejestracja: 2015-11-17, 11:20 Posty: 13 Pomógł: 1
|
Re: Handel Premium-NOTATKA
Witam, a jak zmodyfikować ten raport, żeby wyszukiwało dokument zakupu po notatce (najlepiej także dokument z bufora zakupów)? Zwykła zmiana "TW" na "ZK" nie wystarczy. Wyskakuje błąd: "Niezdefiniowany symbol: bazeZK" Z góry dzięki za pomoc
|
2015-12-21, 14:25 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
Re: Handel Premium-NOTATKA
Wymaga to zmian w kilku miejscach. Jedno z nich to zamiana z baseTW na baseDK (bo tam znajdują się dokumenty zakupu). Aby szukać dodatkowo w buforze też trzeba dopisać kawałek.
Skontaktuj się z Ekspertem.
|
2015-12-21, 14:33 |
|
|
Kto jest online |
Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 17 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
|
|
|
|