-
1. Data: 2011-08-11 20:45:21
Temat: Wyrażenia regularne
Od: Karol Y <k...@o...pl>
Witam, mam mały problem; dla mnie póki co zagadkę. Próbuje sparsować
parametry i ich argumenty za pomocą wyrażenia regularnego i ciąg który
na wejściu mogę dostać wygląda:
param1 arg1[, param2 arg2] ...
a wyrażenie, które na razie wymyśliłem mam takie:
"(?:param1 (?<p1>.*))?(?:, ?param2 (?<p2>.*))?" ...
Problem w tym, że w takiej postaci otrzymuje złe wyniki dla grup p1 i
p2, bo:
p1: arg1, param2 arg2
p2:
Usuwając znak zapytania z końca wyrażenia jest już poprawnie, bo:
p1: arg1
p2: arg2
Ale jednocześnie tracę opcjonalność parametru, a tych parametrów
przypomnę może być wiele. Dodam że każdy parametr jak już jest to w
parze z argumentem oraz że kolejność parametrów jest ściśle określona i
znana.
Tak że ze zbioru ABCDE może wystąpić tylko ABD, ale kolejność będzie
zachowana. Czy taka gramatyka mieści się w ogóle w zakresie wyrażeń
regularnych?
--
Mateusz Bogusz
-
2. Data: 2011-08-11 20:58:17
Temat: Re: Wyrażenia regularne
Od: Wojciech Muła <w...@p...null.onet.pl.invalid>
On Thu, 11 Aug 2011 22:45:21 +0200 Karol Y <k...@o...pl> wrote:
> Witam, mam mały problem; dla mnie póki co zagadkę. Próbuje sparsować
> parametry i ich argumenty za pomocą wyrażenia regularnego i ciąg
> który na wejściu mogę dostać wygląda:
>
> param1 arg1[, param2 arg2] ...
>
> a wyrażenie, które na razie wymyśliłem mam takie:
>
> "(?:param1 (?<p1>.*))?(?:, ?param2 (?<p2>.*))?" ...
>
> Problem w tym, że w takiej postaci otrzymuje złe wyniki dla grup p1 i
> p2, bo:
>
> p1: arg1, param2 arg2
> p2:
Jeśli dopasowywany jest najdłuższy napis, to pierwsze ".*" dopasuje
wszystko, włącznie z przecinkiem i co tam masz dalej. Spróbuj
"[^,]*", tj. dowolny ciąg znaków prócz przecinka.
Ogólnie, to wydaje mi się, że masz tam za dużo znaków zapytania,
wystarczy jeden na parę (nazwa parametru, wartość).
> Tak że ze zbioru ABCDE może wystąpić tylko ABD, ale kolejność będzie
> zachowana. Czy taka gramatyka mieści się w ogóle w zakresie wyrażeń
> regularnych?
Tak. Przecież napisałeś wyrażenie, które dopasowuje napisy w podanej
kolejności. :)
w.
-
3. Data: 2011-08-12 08:16:26
Temat: Re: Wyrażenia regularne
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2011-08-11, Karol Y <k...@o...pl> wrote:
> Witam, mam mały problem; dla mnie póki co zagadkę. Próbuje sparsować
> parametry i ich argumenty za pomocą wyrażenia regularnego i ciąg który
> na wejściu mogę dostać wygląda:
>
> param1 arg1[, param2 arg2] ...
>
[...]
> Ale jednocześnie tracę opcjonalność parametru, a tych parametrów
> przypomnę może być wiele. Dodam że każdy parametr jak już jest to w
> parze z argumentem oraz że kolejność parametrów jest ściśle określona i
> znana.
>
> Tak że ze zbioru ABCDE może wystąpić tylko ABD, ale kolejność będzie
> zachowana. Czy taka gramatyka mieści się w ogóle w zakresie wyrażeń
> regularnych?
A o jakich w ogóle wyrażeniach regularnych mowa? Bo twój przykład
zalatuje mi PCRE.
--
Secunia non olet.
Stanislaw Klekot
-
4. Data: 2011-08-12 10:24:29
Temat: Re: Wyrażenia regularne
Od: Michoo <m...@v...pl>
W dniu 11.08.2011 22:45, Karol Y pisze:
> Witam, mam mały problem; dla mnie póki co zagadkę. Próbuje sparsować
> parametry i ich argumenty za pomocą wyrażenia regularnego i ciąg który
> na wejściu mogę dostać wygląda:
>
> param1 arg1[, param2 arg2] ...
>
> a wyrażenie, które na razie wymyśliłem mam takie:
>
> "(?:param1 (?<p1>.*))?(?:, ?param2 (?<p2>.*))?" ...
[..]
> Ale jednocześnie tracę opcjonalność parametru, a tych parametrów
> przypomnę może być wiele. Dodam że każdy parametr jak już jest to w
> parze z argumentem oraz że kolejność parametrów jest ściśle określona i
> znana.
Tak na szybko to widzę 2 możliwości:
- prostsza to pocięcie po przecinkach (czy nawet od razu na pary
(nazwa_parametru, arg) a potem parsowanie tego co pośrodku
- trudniejsza to przemyślenie co może się pojawić i użycie czegoś
sprytniejszego od .*, prawdopodobnie dodatkowo zakończonego ? na końcu.
Wydaje mi się (nie sprawdzałem), że np coś takiego dla każdego parametru
by mogło działać.
(?:param1[[:space:]]+(?<p1>[[:alnum:]]+?))?(?:,?[[:s
pace:]]+)?
--
Pozdrawiam
Michoo
-
5. Data: 2011-08-13 13:27:21
Temat: Re: Wyrażenia regularne
Od: Karol Y <k...@o...pl>
> Tak na szybko to widzę 2 możliwości:
> - prostsza to pocięcie po przecinkach (czy nawet od razu na pary
> (nazwa_parametru, arg) a potem parsowanie tego co pośrodku
> - trudniejsza to przemyślenie co może się pojawić i użycie czegoś
> sprytniejszego od .*, prawdopodobnie dodatkowo zakończonego ? na końcu.
>
> Wydaje mi się (nie sprawdzałem), że np coś takiego dla każdego parametru
> by mogło działać.
> (?:param1[[:space:]]+(?<p1>[[:alnum:]]+?))?(?:,?[[:s
pace:]]+)?
I podany przykład działa, ale pominąłem drobny szczegół - arg - to w
domyśle zbiór dowolnych znaków również białych. Chyba że ":alnum:" źle
rozumiem jako tylko alfanumeryczne.
--
Mateusz Bogusz
-
6. Data: 2011-08-13 13:31:43
Temat: Re: Wyrażenia regularne
Od: Karol Y <k...@o...pl>
> A o jakich w ogóle wyrażeniach regularnych mowa? Bo twój przykład
> zalatuje mi PCRE.
Tak ogólnie to chciałbym sparsować:
"SELECT ... FROM ... [GROUP BY ...] [HEAVING BY ...][ORDER BY ...]"
aby dostać w zwrocie to co pod wielokropkiem w odpowiednich grupach.
A co ma wspólnego Perl z wyrażeniami w kontekście mojego pytania? Chyba
że źle rozszyfrowałem skrót.
--
Mateusz Bogusz
-
7. Data: 2011-08-14 16:33:57
Temat: Re: Wyrażenia regularne
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2011-08-13, Karol Y <k...@o...pl> wrote:
>> A o jakich w ogóle wyrażeniach regularnych mowa? Bo twój przykład
>> zalatuje mi PCRE.
>
> Tak ogólnie to chciałbym sparsować:
>
> "SELECT ... FROM ... [GROUP BY ...] [HEAVING BY ...][ORDER BY ...]"
>
> aby dostać w zwrocie to co pod wielokropkiem w odpowiednich grupach.
>
> A co ma wspólnego Perl z wyrażeniami w kontekście mojego pytania? Chyba
> że źle rozszyfrowałem skrót.
No pewnie źle rozszyfrowałeś skoro nie wiesz co z tym Perl ma wspólnego.
http://en.wikipedia.org/wiki/PCRE
I nie odpowiedziałeś na moje pytanie: jakiego dialektu wyrażeń
regularnych chcesz używać?
--
Secunia non olet.
Stanislaw Klekot
-
8. Data: 2011-08-15 09:14:55
Temat: Re: Wyrażenia regularne
Od: Karol Y <k...@o...pl>
> No pewnie źle rozszyfrowałeś skoro nie wiesz co z tym Perl ma wspólnego.
> http://en.wikipedia.org/wiki/PCRE
>
> I nie odpowiedziałeś na moje pytanie: jakiego dialektu wyrażeń
> regularnych chcesz używać?
No jak mogę wybrać, to dialekt .NETa
Przy ciągu:
"SELECT kolumna1, kolumna2 FROM tabela1 WHERE a = b ORDER BY 1"
chce złapać po prostu wszystko co pomiędzy słowami kluczowymi:
(?:SELECT (.*))(?:FROM (.*))(?:WHERE (.*))?(?:ORDER BY (.*))?
Oczywiście "problem" już rozwiązany chociażby, poprzez dodanie elementów
opcjonalnych jako nie opcjonalnych po wcześniejszym wyszukaniu czy ciąg
zawiera dane słowo kluczowe. Chce po prostu umieć to zrobić "porządnie",
poprzez jeden wzorzec regexp, bez dodatkowej pętli wyszukującej słowa
kluczowe.
--
Mateusz Bogusz
-
9. Data: 2011-08-15 12:57:27
Temat: Re: Wyrażenia regularne
Od: Michoo <m...@v...pl>
W dniu 15.08.2011 11:14, Karol Y pisze:
>> No pewnie źle rozszyfrowałeś skoro nie wiesz co z tym Perl ma wspólnego.
>> http://en.wikipedia.org/wiki/PCRE
>>
>> I nie odpowiedziałeś na moje pytanie: jakiego dialektu wyrażeń
>> regularnych chcesz używać?
>
> No jak mogę wybrać, to dialekt .NETa
>
> Przy ciągu:
> "SELECT kolumna1, kolumna2 FROM tabela1 WHERE a = b ORDER BY 1"
(?:SELECT (.*?))?(?:FROM (.*?))?(?:WHERE (.*?))?(?:ORDER BY (.*?))?
--
Pozdrawiam
Michoo
-
10. Data: 2011-08-15 22:51:52
Temat: Re: Wyrażenia regularne
Od: Karol Y <k...@o...pl>
>> Przy ciągu:
>> "SELECT kolumna1, kolumna2 FROM tabela1 WHERE a = b ORDER BY 1"
>
> (?:SELECT (.*?))?(?:FROM (.*?))?(?:WHERE (.*?))?(?:ORDER BY (.*?))?
No właśnie proste przerobienie na niezachłanne w połączeniu z grupami
opcjonalnymi nie działa.
--
Mateusz Bogusz