eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingregexp - jak napisać źle i co z tego wynika › regexp - jak napisać źle i co z tego wynika
  • Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail
    From: Paweł Kierski <n...@p...net>
    Newsgroups: pl.comp.programming
    Subject: regexp - jak napisać źle i co z tego wynika
    Date: Thu, 21 May 2009 11:04:12 +0200
    Organization: http://onet.pl
    Lines: 75
    Message-ID: <gv35ej$bt1$1@news.onet.pl>
    Reply-To: n...@p...net
    NNTP-Posting-Host: 91.197.12.14
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: news.onet.pl 1242896659 12193 91.197.12.14 (21 May 2009 09:04:19 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Thu, 21 May 2009 09:04:19 +0000 (UTC)
    User-Agent: Mozilla-Thunderbird 2.0.0.0 (X11/20070601)
    Xref: news-archive.icm.edu.pl pl.comp.programming:182080
    [ ukryj nagłówki ]

    "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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: