Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #29888 > unrolled thread

Wyrażenie regularne - prośba o wyjaśnienie działania

Started byszykcech@gmail.com
First post2017-07-17 08:15 -0700
Last post2017-07-19 12:57 -0700
Articles 9 — 5 participants

Back to article view | Back to pl.comp.programming


Contents

  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

#29888 — Wyrażenie regularne - prośba o wyjaśnienie działania

Fromszykcech@gmail.com
Date2017-07-17 08:15 -0700
SubjectWyraż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]


#29889

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2017-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]


#29890

Fromszykcech@gmail.com
Date2017-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]


#29892

From"Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid>
Date2017-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]


#29891

From"Stachu 'Dozzie' K." <dozzie@go.eat.some.screws.spammer.invalid>
Date2017-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]


#29894

From"AK" <nobody@nowhere.net>
Date2017-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]


#29899

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2017-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]


#29898

FromMateusz Bogusz <mabakay@o2.pl>
Date2017-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]


#29901

Fromszykcech@gmail.com
Date2017-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