Próbuję napisać wyrażenie regularne pasujące do opcjonalnego parametru na końcu ścieżki.
Chcę objąć pierwsze 4 ścieżki, ale nie ostatnie:
/main/sections/create-new
/main/sections/delete
/main/sections/
/main/sections
/main/sectionsextra
Do tej pory to stworzyłem:
//main/sections(/)([a-zA-z]{1}[a-zA-z-]{0,48}[a-zA-z]{1})?/g
To tylko pierwsze pierwsze. Jak mogę je dopasować do pierwszych 4 przypadków?
Odpowiedzi:
2 dla odpowiedzi № 1Możesz dopasować dany ciąg znaków do opcjonalnego ciągu zaczynającego się od /
z dowolnym 1 lub więcej znakami innymi niż /
po zakończeniu aż do końca łańcucha:
/main/sections(?:/[^/]*)?$
^^^^^^^^^^^^^^
Zobacz regex demo. Jeśli naprawdę potrzebujesz ograniczyć opcjonalną część, to tylko litery i -
z -
niedozwolone na początku / końcu (o długości 2+ znaków), użyj
//main/sections(?:/[a-z][a-z-]{0,48}[a-z])?$/i
Lub, aby zezwolić na 1 char podrozdziale:
//main/sections(?:/[a-z](?:[a-z-]{0,48}[a-z])?)?$/i
Detale
/main/sections
- dosłowny podciąg/main/sections
(?:/[^/]*)?
- opcjonalna grupa niezapisująca, odpowiadająca 1 lub 0 wystąpieniom:/
- a/
zwęglać[^/]*
- zanegowana klasa znaków pasująca do dowolnych znaków 0+ innych niż/
$
- koniec ciągu.
JS demo:
var strs = ["/main/sections/create-new","/main/sections/delete","/main/sections/","/main/sections","/main/sectionsextra"];
var rx = //main/sections(?:/[^/]*)?$/;
for (var s of strs) {
console.log(s, "=>", rx.test(s));
}