eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › regexp - jak napisać źle i co z tego wynika
Ilość wypowiedzi w tym wątku: 9

  • 1. Data: 2009-05-21 09:04:12
    Temat: regexp - jak napisać źle i co z tego wynika
    Od: Paweł Kierski <n...@p...net>

    "Trochę" "upojnego" debugowania doprowadziło mnie do znalezienia
    błędu, który został popełniony przy pisaniu regexpa. Oryginalny był
    baaardzo długi i skomplikowany, tu pokażę samo "mięsko".

    W założeniu miał łapać sekwencję:
    ("wyraz" jeden lub więcej razy, "separator") jeden lub więcej razy,
    napis "xyz". "wyraz" to literki, "separator" to kropka lub podkreślenie.

    No i napisano:
    ([A-z]+[._])+xyz

    Po czym regexp trafił na długi ciąg podkreśleń i... zawisł. Tu dam
    spoiler, gdyby ktoś chciał samodzielnie pokombinować 8-)

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    .

    [A-z] to miał być skrót [A-Za-z] (tak można, użyć klas znaków, ale
    komuś się nie chciało zajrzeć do dokumentacji). Niestety [A-z] to
    [A-Z\[\\\]\^_`a-z] (znaki "[\]^_`" oprócz liter). Dla przypadku szukania
    w ciągu podkreśleń można całe wyrażenie zredukować do: "(_+_)+xyz".
    Automat próbuje:
    - _+ dopasowało się do całego ciągu (zachłannie), ale ciąg się skończył
    - _+ dopasowało się do całego ciągu -1 znak, _ dopasowało się do
    ostaniego _, ale nie ma xyz
    - _+ dopasowało się do całego ciągu -2 znaki, _ dopasowało się do
    przedostaniego _, próbujmy jeszcze raz z _+ - dopasowało się, ale nie
    ma _
    - _+ dopasowało się do całego ciągu -3 znaki, _ dopasowało się do
    _ 2 znaki od końca, próbujmy jeszcze raz z _+ - dopasowało się do
    dwóch _ z końca, ale nie ma _
    - _+ dopasowało się do całego ciągu -3 znaki, _ dopasowało się do
    _ 2 znaki od końca, próbujmy jeszcze raz z _+ - dopasowało się do
    przedostaniego _, _ dopasowało się do ostatniego _, ale nie ma xyz
    ... i tak dalej - drzewo poszukiwań rośnie szybko, a zawsze na końcu
    brakuje tego "xyz", a trzeba różnych kombinacji dopasowań "(_+_)+".

    Cały problem powstaje zawsze, gdy dla (R1+R2)+ jest taki ciąg, do
    którego można dopasować zarówno R1 jak i R2, i taki ciąg wystąpi wiele
    razy po sobie.

    --
    Paweł Kierski
    n...@p...net


  • 2. Data: 2009-05-21 13:12:29
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: "Marcin 'Malcom' Malich" <m...@g...com>

    On 21 Maj, 11:04, Paweł Kierski <n...@p...net> wrote:
    >
    >    [A-z] to miał być skrót [A-Za-z] (tak można, użyć klas znaków, ale
    > komuś się nie chciało zajrzeć do dokumentacji). Niestety [A-z] to
    > [A-Z\[\\\]\^_`a-z] (znaki "[\]^_`" oprócz liter). Dla przypadku szukania
    > w ciągu podkreśleń można całe wyrażenie zredukować do: "(_+_)+xyz".

    Czemu nie /(_+)+xzy/ ?

    --
    Pozdrowienia,
    Marcin 'Malcom' Malich
    m...@m...pl
    http://malcom.pl


  • 3. Data: 2009-05-21 14:16:51
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: Paweł Kierski <n...@p...net>

    Marcin 'Malcom' Malich wrote:
    > On 21 Maj, 11:04, Paweł Kierski <n...@p...net> wrote:
    >> [A-z] to miał być skrót [A-Za-z] (tak można, użyć klas znaków, ale
    >> komuś się nie chciało zajrzeć do dokumentacji). Niestety [A-z] to
    >> [A-Z\[\\\]\^_`a-z] (znaki "[\]^_`" oprócz liter). Dla przypadku szukania
    >> w ciągu podkreśleń można całe wyrażenie zredukować do: "(_+_)+xyz".
    >
    > Czemu nie /(_+)+xzy/ ?

    Bo to wynikło z pomyłki - miało być /([A-Za-z]+[._])+xyz/. Zapisane
    zostało jako /([A-z]+[._])+xyz/, czyli w przybliżeniu
    /([A-Z_a-z]+[._])+xyz/, co dla ciągu "__________________" zachowuje się
    jak /(_+_)+xyz/

    --
    Paweł Kierski
    n...@p...net


  • 4. Data: 2009-05-21 17:06:10
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: Daniel Janus <p...@n...korpus.pl>

    Dnia 21.05.2009 Paweł Kierski <n...@p...net> napisał/a:

    > W założeniu miał łapać sekwencję:
    > ("wyraz" jeden lub więcej razy, "separator") jeden lub więcej razy,
    > napis "xyz". "wyraz" to literki, "separator" to kropka lub podkreślenie.
    >
    > No i napisano:
    > ([A-z]+[._])+xyz
    >
    > Po czym regexp trafił na długi ciąg podkreśleń i... zawisł. Tu dam
    > spoiler, gdyby ktoś chciał samodzielnie pokombinować 8-)

    15 sekund bez patrzenia w spoiler. Kto da mniej? ;)

    --D. (jednak nie jest ze mną tak źle... chyba.)

    --
    Daniel 'Nathell' Janus, m...@n...korpus.pl, http://danieljanus.pl
    Nothing smells more like a slaughterhouse than a graduate seminar.
    -- Leonard Cohen, "The Favourite Game"


  • 5. Data: 2009-05-21 20:40:48
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: matmis <m...@g...com>

    napisz jeszcze, z jakiej biblioteki regexp korzystales, bo tak w ogole
    to mozna tak zrobic kompilator wyrazen regularnych, zeby rowniez takie
    wzorce wyszukiwaly sie efektywnie.

    --
    ms



  • 6. Data: 2009-05-22 07:51:22
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: Paweł Kierski <n...@p...net>

    matmis wrote:
    > napisz jeszcze, z jakiej biblioteki regexp korzystales, bo tak w ogole
    > to mozna tak zrobic kompilator wyrazen regularnych, zeby rowniez takie
    > wzorce wyszukiwaly sie efektywnie.

    Fakt - boost::regex. Choć pewnie można również dla dowolnego
    kompilatora znaleźć taką kombinację wyrażenie-ciąg, że wyszukiwanie się
    pokaszani.

    --
    Paweł Kierski
    n...@p...net


  • 7. Data: 2009-05-22 07:54:00
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: Paweł Kierski <n...@p...net>

    Daniel Janus wrote:
    > Dnia 21.05.2009 Paweł Kierski <n...@p...net> napisał/a:
    >
    >> W założeniu miał łapać sekwencję:
    >> ("wyraz" jeden lub więcej razy, "separator") jeden lub więcej razy,
    >> napis "xyz". "wyraz" to literki, "separator" to kropka lub podkreślenie.
    >>
    >> No i napisano:
    >> ([A-z]+[._])+xyz
    >>
    >> Po czym regexp trafił na długi ciąg podkreśleń i... zawisł. Tu dam
    >> spoiler, gdyby ktoś chciał samodzielnie pokombinować 8-)
    >
    > 15 sekund bez patrzenia w spoiler. Kto da mniej? ;)
    >
    > --D. (jednak nie jest ze mną tak źle... chyba.)

    Nieźle! 8-) Choć po uproszczeniu to jednak inna liga: w oryginale ciąg
    podkreśleń był "schowany" w kilkusetznakowym ciągu, a wyrażenie
    zawierało między innymi wzorce dla wszystkich TLD i IP - było w czym
    szukać 8-)

    --
    Paweł Kierski
    n...@p...net


  • 8. Data: 2009-05-24 21:03:48
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: matmis <m...@g...com>

    On 22 Maj, 09:51, Paweł Kierski <n...@p...net> wrote:
    >    Fakt - boost::regex. Choć pewnie można również dla dowolnego
    > kompilatora znaleźć taką kombinację wyrażenie-ciąg, że wyszukiwanie się
    > pokaszani.

    w rzeczy samej! dlatego warto by jeszcze sprawdzic, czy ten problem
    wystepuje przy samym /(_+)+xzy/, czy tez tylko przy tym oryginalnym,
    bardzo dlugim i skomplikowanym regexpie.

    -ms


  • 9. Data: 2009-05-25 07:37:32
    Temat: Re: regexp - jak napisać źle i co z tego wynika
    Od: Paweł Kierski <n...@p...net>

    matmis wrote:
    > On 22 Maj, 09:51, Paweł Kierski <n...@p...net> wrote:
    >> Fakt - boost::regex. Choć pewnie można również dla dowolnego
    >> kompilatora znaleźć taką kombinację wyrażenie-ciąg, że wyszukiwanie się
    >> pokaszani.
    >
    > w rzeczy samej! dlatego warto by jeszcze sprawdzic, czy ten problem
    > wystepuje przy samym /(_+)+xzy/, czy tez tylko przy tym oryginalnym,
    > bardzo dlugim i skomplikowanym regexpie.

    Przy dowolnej tego typu konstrukcji. To co podałem, to właśnie wynik
    analizy i debugowania oryginalnego przypadku.

    --
    Paweł Kierski
    n...@p...net

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: