-
1. Data: 2017-07-17 17:15:52
Temat: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: s...@g...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
-
2. Data: 2017-07-17 18:16:18
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: Piotr Chamera <p...@p...onet.pl>
W dniu 2017-07-17 o 17:15, s...@g...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.
-
3. Data: 2017-07-17 22:09:06
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: s...@g...com
> 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+)$
-
4. Data: 2017-07-18 12:45:16
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2017-07-17, s...@g...com <s...@g...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
-
5. Data: 2017-07-18 12:46:57
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2017-07-17, s...@g...com <s...@g...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
-
6. Data: 2017-07-18 18:07:13
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: "AK" <n...@n...net>
Użytkownik <s...@g...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
-
7. Data: 2017-07-18 21:07:58
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: Mateusz Bogusz <m...@o...pl>
> "(^\\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
-
8. Data: 2017-07-19 10:46:09
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: Piotr Chamera <p...@p...onet.pl>
W dniu 2017-07-18 o 18:07, AK pisze:
> Użytkownik <s...@g...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.
-
9. Data: 2017-07-19 21:57:18
Temat: Re: Wyrażenie regularne - prośba o wyjaśnienie działania
Od: s...@g...com
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]+(?:$)"