eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Wyrażenie regularne - prośba o wyjaśnienie działania
Ilość wypowiedzi w tym wątku: 9

  • 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]+(?:$)"

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: