0

Wyrażenia regularne – Regular Expressions (RegEx)

Wyrażenia regularne - RegEx

O wyrażeniach regularnych powstały już pewnie tysiące ciekawych artykułów, ale mimo to chciałbym dorzucić od siebie pewien zbiór wiadomości, który przyda się osobom dopiero odkrywającym ten obszar. Jak to zazwyczaj jest w moim przypadku – chcę się skupić przede wszystkim na praktyce i na najważniejszych informacjach.

Czym są wyrażenia regularne?

Wyrażenia regularne (Regular Expressions – RegEx) są pewnymi wzorcami tekstu. Przykładowo chcemy się upewnić, że tekst wprowadzony przez użytkownika jest poprawnym polskim kodem pocztowym – jeśli tekst pasuje do wzorca zwrócona zostanie prawda, w przeciwnym wypadku fałsz. Samo sprawdzanie danych za pomocą wyrażeń regularnych jest bardzo przydatne, ale można się posunąć dalej i użyć ich do zamiany tekstu w rozszerzony sposób. Funkcjonalność taką oferuje chociażby Notepad++ czy IDE firmy JetBrains (bardzo polecam ten moduł np. w PHPStorm – jest to naprawdę bardzo intuicyjne narzędzie). Poza edytorami obsługę wyrażeń regularnych oferuje każdy szanujący się język programowania.

Dzięki tym wyrażeniom udało mi się prawie automatycznie zmodyfikować kilkaset plików pochodzących z frameworka CakePHP 2.x, tak aby były kompatybilne z Laravelem 5.x. Nie ma co ukrywać – jest to potężne narzędzie (nie zawsze bardzo optymalne, ale w dzisiejszych czasach nie ma to wielkiego znaczenia) i niejednokrotnie może nam oszczędzić masę ręcznej i żmudnej roboty.

Jak pisać RegExy?

Dozwolone symbole wzorca możemy umieszczać pomiędzy znakami „[” i „]” tworząc w ten sposób grupę. Jeśli chcemy zezwolić na występowanie jednego lub wielu znaków z tej grupy najłatwiej dodać po niej znak „+”. Przedziały znaków definiujemy za pomocą myślnika („-„). Korzystając z tego możemy już podać kilka ciekawych wzorców:

  • Liczba naturalna: [0-9]+
  • Słowo (angielskie): [a-zA-Z]+
  • Słowo (unicode): [\p{L}]+ (ewentualnie można np. tworzyć wyrażenia w stylu: [a-zA-Ząćęółńóśźż]+ chociaż jest to znacznie mniej polecane rozwiązanie)
  • kod pocztowy: [0-9][0-9]-[0-9][0-9][0-9]

Tak jak wspominałem wyrażenia regularne mogą służyć chociażby do zamiany tekstu na inny. Proste przykłady to:

  • Wyszukaj: [0-9]+ Zamień na: (puste pole) – usuwa wszystkie cyfry z tekstu
  • Wyszukaj: [http|https|ftp|sftp] Zamień na: http – zamienia wszystkie wystąpienia znaków: http, https, ftp lub sftp na http

Jeśli chcemy używać znaków specjalnych to najlepiej maskować je znakiem „\”.

Używanie „zmiennych” w wyrażeniach regularnych

Mi najbardziej spodobała się możliwość „zapisywania” fragmentów badanego tekstu do zmiennych. W produktach firmy JetBrains definiujemy je za pomocą nawiasów okrągłych, a następnie odnosimy się do nich za pomocą dolara i kolejnej liczby naturalnej, np. :

  • Wyszukaj: <b>([a-zA-Z ]+)</b> Zamień na: <i>$1</i> – zamienia tag <b> na <i>, jeśli w środku znajdują się tylko litery i spacje, np. <b>SzalonyPecet</b> na  <i>SzalonyPecet</i>
  • Wyszukaj: \$\[\'([a-zA-Z]+)\'\]\[\'([a-zA-Z]+)\'\]\; Zamień na: \$\l$1->$2 – zamienia tekst typu: $['Post']['id']; na $post->id

    Przykład zamiany tekstu przy użyciu wyrażeń regularnych (Regex)

    Przykład zamiany tekstu przy użyciu wyrażeń regularnych (Regex)

Czy to wszystko?

Podane tu informacje absolutnie nie wyczerpują tematu – nie chcę tworzyć dokumentacji wyrażeń regularnych po raz drugi. Niemniej chciałem zwrócić uwagę Czytelnika, że RegExy nie są takie trudne – dość prosto jest je pisać, gdy nabierze się pewnego doświadczenia, a nowoczesne IDE jeszcze bardziej ułatwiają to zadanie. Dodatkowo zamiana tekstu przy użyciu tego typu wyrażeń może przynieść bardzo wymierne korzyści.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *