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?

Chris Farmer
źródło

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

Adam Tegen
źródło
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 ( .*)

Peter Boughton
źródło
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 ( $).

Dave Sherohman
źródło
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).

Sparhawk
źródło
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