Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.programming > #29888 > unrolled thread
| Started by | szykcech@gmail.com |
|---|---|
| First post | 2017-07-17 08:15 -0700 |
| Last post | 2017-07-19 12:57 -0700 |
| Articles | 9 — 5 participants |
Back to article view | Back to pl.comp.programming
Wyrażenie regularne - prośba o wyjaśnienie działania szykcech@gmail.com - 2017-07-17 08:15 -0700
Re: Wyrażenie regularne - prośba o wyjaśnienie działania Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2017-07-17 18:16 +0200
Re: Wyrażenie regularne - prośba o wyjaśnienie działania szykcech@gmail.com - 2017-07-17 13:09 -0700
Re: Wyrażenie regularne - prośba o wyjaśnienie działania "Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid> - 2017-07-18 10:46 +0000
Re: Wyrażenie regularne - prośba o wyjaśnienie działania "Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid> - 2017-07-18 10:45 +0000
Re: Wyrażenie regularne - prośba o wyjaśnienie działania "AK" <nobody@nowhere.net> - 2017-07-18 18:07 +0200
Re: Wyrażenie regularne - prośba o wyjaśnienie działania Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2017-07-19 10:46 +0200
Re: Wyrażenie regularne - prośba o wyjaśnienie działania Mateusz Bogusz <mabakay@o2.pl> - 2017-07-18 21:07 +0200
Re: Wyrażenie regularne - prośba o wyjaśnienie działania szykcech@gmail.com - 2017-07-19 12:57 -0700
| From | szykcech@gmail.com |
|---|---|
| Date | 2017-07-17 08:15 -0700 |
| Subject | Wyrażenie regularne - prośba o wyjaśnienie działania |
| Message-ID | <35ecf944-2571-4998-8899-b6cfe4c08c85@googlegroups.com> |
Witam Kilka lat temu pisałem edytor (dalej go rozwijam) i wtedy napotkałem problem usuwania "trailing spaces" czyli białych znaków z końca linii przed zapisem dokumentu. Są 4 przypadki: 1) pusta linia (nic w tym przypadku nie powinno się dziać), 2) linia z samymi białymi znakami, 3) linia z tekstem i białymi znakami na końcu i 4) linia z tekstem bez białych znaków (nic w tym przypadku nie powinno się dziać). Nie jestem jakimś magiem wyrażeń regularnych i nie mogłem sobie z tym poradzić. Zwróciłem się o pomoc na forum Qt Centre i tam uzyskałem odpowiedź: "(^\\s)*(\\s+)$" I to działa. Jednak nie wiem jak to odczytać. To jest w formacie QRexExp (stare wyrażenia regularne w Qt). Próbuję odczytać: Zero lub więcej początków linii z pojedynczą spacją i za tym co najmniej jedna spacja i koniec wiersza. Tylko, że to bez sensu! Bo jak może być więcej niż jeden początek linii z pojedynczą spacją? Co to za dopasowanie? z góry dzięki za wyjaśnienie i pozdro Szyk Cech
[toc] | [next] | [standalone]
| From | Piotr Chamera <piotr_chamera@poczta.onet.pl> |
|---|---|
| Date | 2017-07-17 18:16 +0200 |
| Message-ID | <okinl3$c63$1@dont-email.me> |
| In reply to | #29888 |
W dniu 2017-07-17 o 17:15, szykcech@gmail.com pisze: > Witam Kilka lat temu pisałem edytor (dalej go rozwijam) i wtedy > napotkałem problem usuwania "trailing spaces" czyli białych znaków z > końca linii przed zapisem dokumentu. Są 4 przypadki: 1) pusta linia > (nic w tym przypadku nie powinno się dziać), 2) linia z samymi > białymi znakami, 3) linia z tekstem i białymi znakami na końcu i 4) > linia z tekstem bez białych znaków (nic w tym przypadku nie powinno > się dziać). Nie jestem jakimś magiem wyrażeń regularnych i nie mogłem > sobie z tym poradzić. Zwróciłem się o pomoc na forum Qt Centre i tam > uzyskałem odpowiedź: "(^\\s)*(\\s+)$" I to działa. Jednak nie wiem > jak to odczytać. To jest w formacie QRexExp (stare wyrażenia > regularne w Qt). Próbuję odczytać: Zero lub więcej początków linii z > pojedynczą spacją i za tym co najmniej jedna spacja i koniec > wiersza. Tylko, że to bez sensu! Bo jak może być więcej niż jeden > początek linii z pojedynczą spacją? Co to za dopasowanie? Nie znam tej implementacji wyrażeń regularnych i nie chce mi się szukać w dokumentacji, ale gdyby „^” był negacją klasy, wtedy wyrażenie miałoby sens – 0 lub więcej nie-białych-znaków, potem co najmniej jeden biały znak i koniec wiersza.
[toc] | [prev] | [next] | [standalone]
| From | szykcech@gmail.com |
|---|---|
| Date | 2017-07-17 13:09 -0700 |
| Message-ID | <adf2d4a5-08ad-4e41-af22-21c27c3ce839@googlegroups.com> |
| In reply to | #29889 |
> Nie znam tej implementacji wyrażeń regularnych i nie chce mi się szukać > w dokumentacji, ale gdyby „^” był negacją klasy, wtedy wyrażenie miałoby > sens – 0 lub więcej nie-białych-znaków, potem co najmniej jeden biały > znak i koniec wiersza. A czy czasem nie jest tak, że negacja dotyczy nawiasów []?!? czyli to mogło by być coś takiego: [^\\s]*(\\s+)$
[toc] | [prev] | [next] | [standalone]
| From | "Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid> |
|---|---|
| Date | 2017-07-18 10:46 +0000 |
| Message-ID | <slrnomrpp1.ggv.dozzie@jarowit.net> |
| In reply to | #29890 |
On 2017-07-17, szykcech@gmail.com <szykcech@gmail.com> wrote: >> Nie znam tej implementacji wyrażeń regularnych i nie chce mi się szukać >> w dokumentacji, ale gdyby „^” był negacją klasy, wtedy wyrażenie miałoby >> sens – 0 lub więcej nie-białych-znaków, potem co najmniej jeden biały >> znak i koniec wiersza. > > A czy czasem nie jest tak, że negacja dotyczy nawiasów []?!? > czyli to mogło by być coś takiego: > [^\\s]*(\\s+)$ "zero lub więcej nie-spacji", potem "co najmniej jedna spacja", potem "koniec linii/tekstu". -- Secunia non olet. Stanislaw Klekot
[toc] | [prev] | [next] | [standalone]
| From | "Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid> |
|---|---|
| Date | 2017-07-18 10:45 +0000 |
| Message-ID | <slrnomrpls.ggv.dozzie@jarowit.net> |
| In reply to | #29888 |
On 2017-07-17, szykcech@gmail.com <szykcech@gmail.com> wrote: [...] > "(^\\s)*(\\s+)$" > I to działa. Jednak nie wiem jak to odczytać. To jest w formacie > QRexExp (stare wyrażenia regularne w Qt). Nie wiem czym się różnią te "QRexExp" od innych dialektów regexpów, ale jeśli nawiasy okrągłe są grupowaniem, a sam zapis jest stringiem w C++, to dostajesz #v+ (^\s)*(\s+)$ #v- które... [...] > Tylko, że to bez sensu! Bo jak może być więcej niż jeden początek linii z pojedynczą spacją? Co to za dopasowanie? ...jest brzydko napaprane. Gwiazdka Kleenego w tym miejscu działa jak pytajnik, właśnie ze względu na zakotwiczenie do początku linii/tekstu. Innymi słowy ktoś, kto ci podał ten regexp, sam nie umiał wiele więcej niż ty wtedy. -- Secunia non olet. Stanislaw Klekot
[toc] | [prev] | [next] | [standalone]
| From | "AK" <nobody@nowhere.net> |
|---|---|
| Date | 2017-07-18 18:07 +0200 |
| Message-ID | <oklbo5$l7$1@node2.news.atman.pl> |
| In reply to | #29888 |
Użytkownik <szykcech@gmail.com> napisał: > i tam uzyskałem odpowiedź: > "(^\\s)*(\\s+)$" a moze by tak po prostu ? (nie wiem czy zadziala - pisze "z palca") "^(\\s*[^\\s]+)*\\s+$" PS: Toto raczej do pcre (czyli Perl i/lub Python), ale chyba z Qt tez zadziala AK
[toc] | [prev] | [next] | [standalone]
| From | Piotr Chamera <piotr_chamera@poczta.onet.pl> |
|---|---|
| Date | 2017-07-19 10:46 +0200 |
| Message-ID | <okn614$t01$1@dont-email.me> |
| In reply to | #29894 |
W dniu 2017-07-18 o 18:07, AK pisze: > Użytkownik <szykcech@gmail.com> napisał: > >> i tam uzyskałem odpowiedź: >> "(^\\s)*(\\s+)$" > > a moze by tak po prostu ? (nie wiem czy zadziala - pisze "z palca") > > "^(\\s*[^\\s]+)*\\s+$" > > PS: Toto raczej do pcre (czyli Perl i/lub Python), ale chyba z Qt tez > zadziala Jeszcze prostsze byłoby coś takiego (o ile w QT zadziała) ^(.*?)(\\s+)$ W tym przypadku „?” usuwa „żarłoczność” gwiazdki. Z OP przypadków 1 i 4 nie dopasuje wcale, w przypadkach 2 i 3 pierwsza grupa dopasuje cały tekst od początku stringa (w przypadku 2 pusty), a druga grupa dopasuje spacje na końcu.
[toc] | [prev] | [next] | [standalone]
| From | Mateusz Bogusz <mabakay@o2.pl> |
|---|---|
| Date | 2017-07-18 21:07 +0200 |
| Message-ID | <oklmaj$an4$1@node2.news.atman.pl> |
| In reply to | #29888 |
> "(^\\s)*(\\s+)$" > I to działa. Jednak nie wiem jak to odczytać. Tutaj masz wyjaśnienie - https://regex101.com/r/Ec5c52/1 A tutaj wizualizację - https://www.debuggex.com/r/BvizLCC0k47D_Xcv -- Pozdrawiam, Mateusz Bogusz
[toc] | [prev] | [next] | [standalone]
| From | szykcech@gmail.com |
|---|---|
| Date | 2017-07-19 12:57 -0700 |
| Message-ID | <6497ff05-4a92-4695-8aac-54ad2ad79a38@googlegroups.com> |
| In reply to | #29888 |
Dziękuję za wyjaśnienia i wskazówki. Ogarnąłem pilniejsze tematy i trochę pogrzebałem w dokumentacji - i zaraz wyjaśnię to wyrażenie i podam prawidłowe rozwiązanie w Qt z QRegExp (stare wyrażenia regularne). "(^\\s)*(\\s+)$" Należy odczytać tak: początek pliku z pojedynczym białym znakiem może wystąpić zero lub więcej razy (ten fragment nigdy nie był spełniony), a po nim co najmniej jeden biały znak przed końcem pliku. To u mnie działało, gdyż w QPlainTextEdit::document()->find(QRegExp, index) najwyraźniej to wyrażenie odpala dla każdej linii osobno (chyba dlatego, że każda linia jest tam w osobnym bloku). Wtedy pierwsza część wyrażenia nie była nigdy spełniona a druga pasowała (wybierała wszystkie spacje przed końcem linii - bo każda linia była traktowana jako osobny dokument). "[ \\t]+(?:\\n|$)" To jest prawidłowe rozwiązanie. Grupowanie nie jest konieczne, gdyż selekcja tekstu w zwracanym kursorze (QTextCursor) jaką tworzy QPlainTextEdit::document()->find opiera się na całkowitym dopasowaniu wzorca, a nie na pierwszej dopasowanej/przechwyconej grupie. Tak więc: szukam co najmniej jednej spacji lub tabulatora jaka jest przed końcem linii lub przed końcem pliku. Choć jak pisałem ze względu na specyfikę tej funkcji find powinno wystarczyć by: "[ \\t]+(?:$)"
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.programming
csiph-web