正则表达式:仅在斜杠之间匹配路由参数,但可选结束斜杠
Regex: Matching route parameters between slashes only but optional end slash
所以我这里有这个正则表达式:
\/?({[a-zA-Z_0-9]*})\/?
我希望它与这些匹配:
# Valid
/test3/{id}/{test}/{id}
# Valid
/admin/{slug}
# Not Valid
/test3{id}{test}
# Not Valid
/test/{id}/yyy/{dd}/dwdw/{wd}{d}
# Valid
/user/post/{id}
# Valid
/{tt}/{t}
# Valid
/test/{id}/yyy/{dd}////dwdw/{wd}/{d}
但我希望它不匹配参数之间没有斜线的参数,例如 {id}{test}
不应该匹配。
我该怎么做?
我在这里设置了一个正则表达式:https://regex101.com/r/awUDhM/5
您可以查找 /foo
、/{bar}
的重复模式,或者只是空的 /
。代码片段:
var input = [
'/test3/{id}/{test}/{id}',
'/admin/{slug}',
'/test3{id}{test}',
'/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
'/user/post/{id}',
'/{tt}/{t}',
'/test/{id}/yyy/{dd}////dwdw/{wd}/{d}'
];
input.forEach(function(str) {
var result = /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/.test(str);
console.log(str + ' ==> ' + result);
});
输出:
/test3/{id}/{test}/{id} ==> true
/admin/{slug} ==> true
/test3{id}{test} ==> false
/test/{id}/yyy/{dd}/dwdw/{wd}{d} ==> false
/user/post/{id} ==> true
/{tt}/{t} ==> true
/test/{id}/yyy/{dd}////dwdw/{wd}/{d} ==> true
/^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/
正则表达式的解释:
^
-- 字符串开头的锚点
(...)+
-- 里面的内容出现一次或多次
\/(...|...)
-- 期望一个斜杠,后跟一个逻辑或组
[a-zA-Z0-9]*
-- 第一个 OR 项:只有字母数字字符,包括 none
\{[a-z]+\}
-- 第二个 OR 项:一个或多个包含在 {...}
中的小写字符
$
-- 字符串末尾的锚点
只要检查一下字符串中是否没有 }{
:
^(?:(?!}{).)+$
php代码:
$strs = [
'/test3/{id}/{test}/{id}',
'/admin/{slug}',
'/test3{id}{test}',
'/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
'/user/post/{id}',
'/{tt}/{t}',
'/test/{id}/yyy/{dd}////dwdw/{wd}/{d}',
];
foreach($strs as $str) {
if (preg_match('/^(?:(?!}{).)+$/', $str)) {
echo "valid: $str\n";
} else {
echo "Not valid: $str\n";
}
}
输出:
valid: /test3/{id}/{test}/{id}
valid: /admin/{slug}
Not valid: /test3{id}{test}
Not valid: /test/{id}/yyy/{dd}/dwdw/{wd}{d}
valid: /user/post/{id}
valid: /{tt}/{t}
valid: /test/{id}/yyy/{dd}////dwdw/{wd}/{d}
所以我这里有这个正则表达式:
\/?({[a-zA-Z_0-9]*})\/?
我希望它与这些匹配:
# Valid
/test3/{id}/{test}/{id}
# Valid
/admin/{slug}
# Not Valid
/test3{id}{test}
# Not Valid
/test/{id}/yyy/{dd}/dwdw/{wd}{d}
# Valid
/user/post/{id}
# Valid
/{tt}/{t}
# Valid
/test/{id}/yyy/{dd}////dwdw/{wd}/{d}
但我希望它不匹配参数之间没有斜线的参数,例如 {id}{test}
不应该匹配。
我该怎么做?
我在这里设置了一个正则表达式:https://regex101.com/r/awUDhM/5
您可以查找 /foo
、/{bar}
的重复模式,或者只是空的 /
。代码片段:
var input = [
'/test3/{id}/{test}/{id}',
'/admin/{slug}',
'/test3{id}{test}',
'/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
'/user/post/{id}',
'/{tt}/{t}',
'/test/{id}/yyy/{dd}////dwdw/{wd}/{d}'
];
input.forEach(function(str) {
var result = /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/.test(str);
console.log(str + ' ==> ' + result);
});
输出:
/test3/{id}/{test}/{id} ==> true
/admin/{slug} ==> true
/test3{id}{test} ==> false
/test/{id}/yyy/{dd}/dwdw/{wd}{d} ==> false
/user/post/{id} ==> true
/{tt}/{t} ==> true
/test/{id}/yyy/{dd}////dwdw/{wd}/{d} ==> true
/^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/
正则表达式的解释:
^
-- 字符串开头的锚点(...)+
-- 里面的内容出现一次或多次\/(...|...)
-- 期望一个斜杠,后跟一个逻辑或组[a-zA-Z0-9]*
-- 第一个 OR 项:只有字母数字字符,包括 none\{[a-z]+\}
-- 第二个 OR 项:一个或多个包含在{...}
中的小写字符
$
-- 字符串末尾的锚点
只要检查一下字符串中是否没有 }{
:
^(?:(?!}{).)+$
php代码:
$strs = [
'/test3/{id}/{test}/{id}',
'/admin/{slug}',
'/test3{id}{test}',
'/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
'/user/post/{id}',
'/{tt}/{t}',
'/test/{id}/yyy/{dd}////dwdw/{wd}/{d}',
];
foreach($strs as $str) {
if (preg_match('/^(?:(?!}{).)+$/', $str)) {
echo "valid: $str\n";
} else {
echo "Not valid: $str\n";
}
}
输出:
valid: /test3/{id}/{test}/{id}
valid: /admin/{slug}
Not valid: /test3{id}{test}
Not valid: /test/{id}/yyy/{dd}/dwdw/{wd}{d}
valid: /user/post/{id}
valid: /{tt}/{t}
valid: /test/{id}/yyy/{dd}////dwdw/{wd}/{d}