Słowo kluczowe: wyrażenia regularne


20 grudnia 2017 (środa), 10:44:44

Wyrażenia regularne

Obserwacja:

Raz na rok przychodzi taki dzień, że przypominam sobie Wyrażenia Regularna i nawet próbuję )z większym lub mniejszym sukcesem) je użyć przy rozwiązaniu jakiegoś problemu.

Czy dziś jest ten dzień?

Daty:

  • listopad 2005 -  wtedy robiłem parser do notek w blogu (jest notka)
  • co najmniej 5 albo i 10 takich dni, ale daty trudno określić
  • 20 grudnia 2017, w coworku BussnesLink na Chorzowskiej, pracuję nad blogiem W34

Lista:

. - dowolny znak

\ - znak po backslash jest traktowany normalnie, a więc \. to kropka a nie dowolny znak

[abc] - oznacza znak z tego zestawu

[0-9] - oznacza znak z zakresu znaków

[a-zA-Z] - oznacza małą lub dużą literę

[^abc] - oznacza dowolny znak z poza tego zestawu

( ) - grupowanie symboli w jakimś celu

* - zero lub więcej wystąpień poprzedzającego znaku

? - zero lub jedno wystąpienie poprzedzającego znaku

+ - jedno wystąpienie poprzedzającego znaku

^ - początek wiersza

$ - koniec wiersza

| - alternatywa, oznacza, że może wystąpić znak z lewej lub z prawej strony

 Przykłady:

\([0-9][0-9]*\) - wyszukuje numery wersetów

$regex = '/(class)(\s*)=(\s*)(["\'])([^"\']*)'.$class.'([^"\']*)\4/i'; - tworzy w PHP regexpa do wyszukania klasy (fraza class=) w kodzie HTML,Kuba używa tego w blogu.

Wiedza:


Kategorie: programowanie, _blog


Słowa kluczowe: wyrażenia regularne


Komentarze: (1)

wojtek, August 9, 2021 09:01 Skomentuj komentarz


Dziś jest ten dzień, w którym raz na 7 lat programista musi przypomnieć sobie wyrażenia regularne.
!!!! Uwaga - zapomniałem dodać, że muszę sprawdzić poprawność daty wpisanej z palca, a więc często wpisanej źle. Ale spoko - jeszcze 4 godzinki i dam radę.


if (preg_match("'^20[1-2][0-9]-[0-1][0-9]-[0-3][0-9], dziś'", $message->subject)) {
echo $message->subject." "."==TAK===\n";
} else {
echo $message->subject." "."===NIE==\n";
}


A potem była walka, bo coś to nie działa dla UTF-8

// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/u';
// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s(\w+).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/u';
// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-ZęółśążźćńĘÓŁŚĄŻŹĆŃ]+).([a-zA-ZęółśążźćńĘÓŁŚĄŻŹĆŃ]+).*$/u';
// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]{5,13}).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/u';
/// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([[:alpha:]]+}).([[:alpha:]]+).*$/u';
/// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]{5,13}).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/ismU';
/// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]{5,13}).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/is';
// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([\p{L}]+).([\p{L}]+).*$/isu';
// $pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([\p{L}]+).([\p{L}]+).*$/u';
$pp = '/^(\d{4})-(\d{2})-(\d{2}),?\s([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).([a-zA-Zążśźęćń󳥯ŚŹĘĆŃÓŁ]+).*$/u';

Skomentuj notkę
9 listopada 2005 (środa), 19:06:06

Programowanie ...

Programowanie wyrażeń regularnych jest piękne a do tego bardzo mnie ostatnio bawi.

$x = preg_replace_callback ('/NN((j?[^N]+N?)*(j[^N]+N?)+(j?[^N]+N?)*)NN/',
     create_function (
                '$arg',
                '
                $y = $arg [1];
                $y = preg_replace ('/j([^N]+)N?/', "<LI></LI>nN",$y);
                $y = preg_replace ('/([^N/<][^N]*)N?/', "<P></P>n",$y);
                $y = preg_replace ('/</LI>nN/', "</LI>n", $y);
                return "NN<UL>" . $y . "</UL>NN";
                '
       ),
     $x);

Piękne w nim jest to, że jest ono wielką pułapką dla postmodernistycznych informatyków. Tego nie da się wziąć z przykładu i lekko przerobić, nie da się zaadoptować, wzorować na przykładzie. Po prostu to trzeba zrozumieć aby z tego korzystać - żadnego chodzenia na skróty, żadnego podręcznika za 5zł pt. "Jak programować wyrażenia regularne w 5 minut".

A moja metoda jest taka: napisać na karteczce przypasowywany tekst, napisać pod spodem propozycję wyrażenia i z lekka zezując przesuwać palec jednej ręki po tekście a drugiej po wzorcu. Przy pierwszym błędzie poprawić wzorzec zapisując go poniżej. Jeżeli kartka się skończy wziąć następną, a jak skończy się ryza to następną.

I jeszcze obserwacja - zapis przypomina nieco czasy programowania w asemblerze, w czasach gdy nie było jeszcze kompilatorów (meta)asemblera i procedury zapisywało się szesnastkowo. Np w Intelu 8080 i Z-80 CALL to bylo CD a RET C9


Robię sobie odświeżanie pamięci: JMP C3, LD A 21...., NOP 00, LD HL 23...., prefix: hl->iy FD hl->ix DD, HOLD 80, JZ C2, JC CA, słabo, słabo z pamięcią.


Kategorie: informatyka, _blog


Słowa kluczowe: informatyka, PHP, HTML, wyrażenia regularne


Komentarze: (1)

lilienn, November 12, 2005 00:06 Skomentuj komentarz


pozytywne mysli
Skomentuj notkę

Disclaimers :-) bo w stopce coś wyglądającego mądrze można napisać. Wszystkie powyższe notatki są moim © wymysłem i jako takie związane są ze mną. Ale są też materiały obce, które tu przechowuję lub cytuje ze względu na ich dobrą jakość, na inspiracje, bądź ilustracje prezentowanego lub omawianego tematu. Jeżeli coś narusza czyjeś prawa - proszę o sygnał abym mógł czym prędzej naprawić błąd i naruszeń zaniechać.