我试图写一个正则表达式来匹配路径末尾的可选参数 我想覆盖前4个路径,但不是最后一个路径:
/main/sections/create-new
/main/sections/delete
/main/sections/
/main/sections
/main/sectionsextra
到目前为止,我已创建了这个:
/\/main\/sections(\/)([a-zA-z]{1}[a-zA-z\-]{0,48}[a-zA-z]{1})?/g
这只能找到第一个3.如何使它与前4个案例匹配?
答案 0 :(得分:2)
您可以将有问题的字符串与以/
开头的可选字符串与字符串末尾之后的/
以外的任何1个或多个字符进行匹配:
\/main\/sections(?:\/[^\/]*)?$
^^^^^^^^^^^^^^
请参阅regex demo。如果您确实需要将可选子部分限制为仅包含字母和-
,并且在开始/结束时不允许-
(长度为2+个字符),请使用
/\/main\/sections(?:\/[a-z][a-z-]{0,48}[a-z])?$/i
或者,也允许1个char子部分:
/\/main\/sections(?:\/[a-z](?:[a-z-]{0,48}[a-z])?)?$/i
<强>详情
\/main\/sections
- 文字子串/main/sections
(?:\/[^\/]*)?
- 一个可选的非捕获组,匹配1或0次出现:
\/
- /
字符[^\/]*
- 与/
以外的任何0 +字符匹配的否定字符类$
- 字符串结束。JS演示:
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));
}
&#13;