Szukaj…


Uwagi

Dla wielu programistów wyrażenie regularne jest rodzajem magicznego miecza, który rzucają w celu rozwiązania każdego rodzaju analizy tekstu. Ale to narzędzie ma nic magicznego, a mimo to jest świetne w tym co robi, nie jest to w pełni funkcjonalny język programowania (czyli nie jest kompletne Turinga).

Co oznacza „wyrażenie regularne”?

Wyrażenia regularne wyrażają język zdefiniowany przez gramatykę regularną, którą można rozwiązać za pomocą niedeterministycznego automatu skończonego (NFA), gdzie dopasowanie jest reprezentowane przez stany.

Gramatyka regularna to najprostsza gramatyka wyrażona przez hierarchię Chomsky'ego .

Hierarchia Chomsky'ego

Mówiąc wprost, zwykły język jest wizualnie wyrażany przez to, co może wyrazić NFA, a oto bardzo prosty przykład NFA:

Przykład NFA

A język wyrażeń regularnych jest tekstową reprezentacją takiego automatu. Ten ostatni przykład jest wyrażony za pomocą następującego wyrażenia regularnego:

^[01]*1$

Który pasuje do dowolnego łańcucha rozpoczynającego się od 0 lub 1 , powtarzającego się 0 lub więcej razy, który kończy się na 1 . Innymi słowy, jest to wyrażenie regularne, aby dopasować liczby nieparzyste z ich reprezentacji binarnej.

Czy wszystkie wyrażenia regularne są w rzeczywistości zwykłą gramatyką?

W rzeczywistości tak nie jest. Wiele silników wyrażeń regularnych uległo poprawie i używa automatów przesuwających , które mogą się gromadzić i wyświetlać informacje w trakcie działania. Automaty te określają, co się nazywa gramatyk bezkontekstowych w hierarchii Chomsky'ego. Najbardziej typowym zastosowaniem tych w nieregularnym wyrażeniu regularnym jest użycie wzoru rekurencyjnego do dopasowywania nawiasów.

Przykładem takiej implementacji jest rekursywne wyrażenie regularne takie jak poniżej (które pasuje do nawiasów):

{((?>[^\(\)]+|(?R))*)}

(ten przykład nie działa z silnikiem re Pythona, ale z silnikiem regex lub z silnikiem PCRE ).

Zasoby

Więcej informacji na temat teorii wyrażeń regularnych można znaleźć w następujących kursach udostępnionych przez MIT:

Podczas pisania lub debugowania złożonego wyrażenia regularnego istnieją narzędzia online, które mogą pomóc w wizualizacji wyrażeń regularnych jako automatów, na przykład witryna debuggex .

Wersje

PCRE

Wersja Wydany
2) 2015-01-05
1 01.06.1997

Używany przez: PHP 4.2.0 (i wyższe), Delphi XE (i wyższe), Julia , Notepad ++

Perl

Wersja Wydany
1 1987-12-18
2) 1988-06-05
3) 1989-10-18
4 1991-03-21
5 1994-10-17
6 2009-07-28

.NETTO

Wersja Wydany
1 2002-02-13
4 2010-04-12

Języki: C #

Jawa

Wersja Wydany
4 2002-02-06
5 2004-10-04
7 2011-07-07
SE8 18.03.2014

JavaScript

Wersja Wydany
1.2 1997-06-11
1.8.5 2010-07-27

Pyton

Wersja Wydany
1.4 1996-10-25
2.0 2000-10-16
3.0 2008-12-03
3.5.2 07.06.2016

Oniguruma

Wersja Wydany
Inicjał 2002-02-25
5.9.6 2014-12-12
Onigmo 2015-01-20

Podnieść

Wersja Wydany
0 1999-12-14
1.61.0 2016-05-13

POSIX

Wersja Wydany
BRE 01.01.1997
ERE 01.01.2008

Języki: Bash

Przewodnik po postaciach

Zauważ, że niektóre elementy składniowe zachowują się inaczej w zależności od wyrażenia.

Składnia Opis
? Dopasuj poprzedni znak lub podwyrażenie 0 lub 1 razy. Używany również do grup przechwytywania i nazwanych grup przechwytywania.
* Dopasuj poprzedni znak lub podwyrażenie 0 lub więcej razy.
+ Dopasuj poprzedni znak lub podwyrażenie 1 lub więcej razy.
{n} Dopasuj poprzedni znak lub podwyrażenie dokładnie n razy.
{min,} Dopasuj poprzedni znak lub podwyrażenie min lub więcej razy.
{,max} Dopasuj poprzedni znak lub podwyrażenie maksymalnie lub mniej razy.
{min,max} Dopasuj poprzedni znak lub podwyrażenie co najmniej min razy, ale nie więcej niż max . Razy.
- Gdy zawarte w nawiasach kwadratowych wskazuje to ; np. [3-6] dopasowuje znaki 3, 4, 5 lub 6.
^ Początek ciągu (lub początek wiersza, jeśli podano opcję multiline /m ) lub neguje listę opcji (tzn. Jeśli w nawiasach kwadratowych [] )
$ Koniec łańcucha (lub koniec linii, jeśli podano opcję multilinii /m ).
( ... ) Grupuje podwyrażenia, przechwytuje pasujące treści w specjalnych zmiennych ( \1 , \2 itd.), Których można użyć później w ramach tego samego wyrażenia regularnego, na przykład (\w+)\s\1\s dopasowuje powtarzanie słów
(?<name> ... ) Grupuje podwyrażenia i przechwytuje je w nazwanej grupie
(?: ... ) Grupuje podwyrażenia bez przechwytywania
. Odpowiada dowolnemu znakowi oprócz podziałów linii ( \n , i zwykle \r ).
[ ... ] Każdy znak między tymi nawiasami powinien być dopasowany jeden raz. Uwaga: ^ następujące po nawiasie otwartym neguje ten efekt. - występowanie w nawiasach pozwala określić zakres wartości (chyba że jest to pierwszy lub ostatni znak, w którym to przypadku reprezentuje zwykły myślnik).
\ Ucieka następującemu znakowi. Używany również w sekwencjach meta - tokenach regularnych o specjalnym znaczeniu.
\$ dolar (tj. specjalny znak ucieczki)
\( otwarty nawias (tzn. specjalny znak ucieczki)
\) ścisły nawias (tzn. znak specjalny, który uciekł)
\* gwiazdka (tj. specjalny znak ucieczki)
\. kropka (tzn. uciekający znak specjalny)
\? znak zapytania (tj. specjalny znak ucieczki)
\[ lewy (otwarty) nawias kwadratowy (tzn. specjalny znak ucieczki)
\\ ukośnik odwrotny (tzn. uciekł znak specjalny)
\] prawy (zamknięty) nawias kwadratowy (tzn. znak specjalny, który uciekł)
\^ daszek (tj. specjalny znak ucieczki)
\{ lewy (otwarty) nawias klamrowy / klamra (tzn. uciekł znak specjalny)
\| potok (tj. specjalny znak ucieczki)
\} prawy (zamknij) nawias klamrowy / klamra (tj. uciekający znak specjalny)
\+ plus (tj. specjalny znak ucieczki)
\A początek ciągu
\Z koniec łańcucha
\z absolut łańcucha
\b granica słowa (sekwencji alfanumerycznej)
\1 , \2 itd. odniesienia do poprzednio dopasowanych podwyrażeń, pogrupowane według () , \1 oznacza pierwsze dopasowanie, \2 oznacza drugie dopasowanie itp.
[\b] backspace - gdy \b znajduje się w klasie znaków ( [] ) dopasowuje backspace
\B negated \b - dopasowuje w dowolnej pozycji między znakami dwuliterowymi, a także w dowolnej pozycji między dwoma znakami niebędącymi wyrazami
\D niecyfrowe
\d cyfra
\e ucieczka
\f form feed
\n linia wiersza
\r powrót karetki
\S spoza białej przestrzeni
\s Biała przestrzeń
\t patka
\v zakładka pionowa
\W bez słów
\w słowo (tj. znak alfanumeryczny)
{ ... } nazwany zestaw znaków
| lub; tj. określa poprzednie i poprzednie opcje.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow