Wyrażenie regularne, aby dopasować koniec wiersza adresu URL lub znak „/”


80

Mam adres URL i próbuję dopasować go do wyrażenia regularnego, aby wyciągnąć kilka grup. Problem polega na tym, że adres URL może kończyć się lub kontynuować znakiem „/” i innym tekstem adresu URL. Chciałbym dopasować takie adresy URL:

Ale nie dopasowuj czegoś takiego:

Pomyślałem więc, że najlepiej będzie wyglądać tak:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

gdzie klasa znaków na końcu zawiera znak „/” lub koniec wiersza. Jednak klasa postaci nie jest zadowolona z umieszczonego tam znaku „$”. Jak najlepiej rozróżnić te adresy URL, jednocześnie wycofując prawidłowe grupy?

Odpowiedzi:


41
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$

Pierwsza grupa przechwytująca (.+)

.+ dopasowuje dowolny znak (z wyjątkiem terminatorów linii)

  • + Kwantyfikator - dopasowuje od jednego do nieograniczonej liczby razy, tyle razy, ile to możliwe, dając w razie potrzeby (chciwy)

2. grupa przechwytująca (\d{4}-\d{2}-\d{2})

\d{4}dopasowuje cyfrę (równe [0-9])

  • {4} Kwantyfikator - Dopasowuje dokładnie 4 razy

-dopasowuje znak -dosłownie (z uwzględnieniem wielkości liter)

\d{2}dopasowuje cyfrę (równe [0-9])

  • {2} Kwantyfikator - Dopasowuje dokładnie 2 razy

-dopasowuje znak -dosłownie (z uwzględnieniem wielkości liter)

\d{2}dopasowuje cyfrę (równe [0-9])

  • {2} Kwantyfikator - Dopasowuje dokładnie 2 razy

-dopasowuje znak -dosłownie (z uwzględnieniem wielkości liter)

Trzecia grupa przechwytująca (\d+)

\d+dopasowuje cyfrę (równe [0-9])

  • + Kwantyfikator - dopasowuje od jednego do nieograniczonej liczby razy, tyle razy, ile to możliwe, dając w razie potrzeby (chciwy)

4. grupa przechwytująca (.*)?

? Kwantyfikator - dopasowuje od zera do jednego razy, tyle razy, ile to możliwe, dając w razie potrzeby (chciwy)

.*dopasowuje dowolny znak (z wyjątkiem terminatorów linii)

  • * Kwantyfikator - dopasowuje od zera do nieograniczonej liczby razy, tyle razy, ile to możliwe, dając w razie potrzeby (chciwy)

$ zapewnia pozycję na końcu łańcucha


126

Aby dopasować albo / lub koniec treści, użyj (/|\z)

Ma to zastosowanie tylko wtedy, gdy nie używasz dopasowania wielowierszowego (tj. Dopasowujesz pojedynczy adres URL, a nie listę adresów rozdzielanych znakami nowej linii).


Aby umieścić to w zaktualizowanej wersji tego, co masz:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)

Zauważ, że zmieniłem początek tak, aby był niechcianym dopasowaniem dla innych niż białe znaki ( \S+?), zamiast dopasowywania czegokolwiek i wszystkiego ( .*)


6
Jak mogę dać więcej punktów;) Dzięki za to. Samo udokumentowanie (/ | \ A) dopasuje ukośnik lub początek ciągu.
Senica Gonzalez

Gratulacje za nową odznakę Gold Answer;) - Właśnie sobie uświadomiłem, że popchnąłem Cię do 100!
random_user_name

63

Masz teraz kilka wyrażeń regularnych, które będą robić, co chcesz, więc jest to odpowiednio uwzględnione.

Co nie zostało wspomniane jest, dlaczego próba nie będzie działać: wewnątrz klasy znaków, $(jak również ^, .i /) nie ma specjalnego znaczenia, więc [/$]zapałek albo dosłowne /lub dosłownym $, a nie kończące regex ( /) lub dopasowanie koniec linii ( $).


8
Jest to coś często zapomnianego i niewystarczająco wspominanego w dokumentach regex.
Steve Dunn

6
Zauważ, że ^ może mieć specjalne znaczenie w klasie znaków. Jeśli jest to pierwszy znak w klasie, oznacza to, że jest to klasa ujemna, która będzie pasować do wszystkiego poza pozostałymi znakami. np. aby dopasować cokolwiek poza a lub b, możesz użyć [^ ab]. Aby dołączyć dosłowny ^, po prostu upewnij się, że nie jest pierwszy, więc aby dopasować a, b lub ^, użyjesz [ab ^].
David Mason

18

W Ruby i Bash możesz używać $nawiasów wewnętrznych.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)

(To rozwiązanie jest podobne do rozwiązania Pete'a Boughton'a, ale zachowuje użycie $, co oznacza koniec wiersza, zamiast używania \z, co oznacza koniec ciągu).


2
PHP też z tego, co mogę powiedzieć. Nie widzę powodu, dla $którego nie można by użyć w nawiasach ()w żadnej implementacji. To nawiasy []sprawiają, że jest to dosłowne.
Joel Mellon

3
$działa w ten sposób w javascript, a \znie (Chrome 48, Firefox 43, IE9).
Vsevolod Golovanov

1
Jest to najprostsza opcja. Dopasuj ukośnik lub koniec linii. Pasuje nawet do tytułu tego pytania!
Brett Donald
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.