[英]Regex match url with params to specific pattern but not query string
我的正则表达式模式:
const pattern = /^\/(test|foo|bar\/baz|en|ppp){1}/i;
const mat = pattern.exec(myURL);
我想匹配:
www.mysite.com/bar/baz/myParam/...anything here
但不是
www.mysite.com/bar/baz/?uid=100/..
myParam
可以是带或不带破折号的任何字符串,但只有在此之后,其他任何事情都可以发生,例如查询字符串,但不能在baz
之后立即发生。
试过
/^\/(test|foo|bar\/baz\/[^/?]*|en|ppp){1}/i;
什么都行不通。
我相信,这就是您所要求的:
const myURL = "www.mysite.com/bar/baz/myParam/"; const myURL2 = "www.mysite.com/bar/baz/?uid=100"; const regex = /\\/[^\\?]\\w+/gm; console.log('with params', myURL.match(regex)); console.log('with queryParams', myURL2.match(regex))
如果这不是您所要求的,那么还有另一个与您相关的问题,没有正则表达式:这里是
对于 2 个示例字符串,您可以使用
^[^\/]+\/bar\/baz\/[\w-]+\/.*$
如果你也想使用交替,它可能看起来像
^[^\/]+\/(?:test|foo|bar)\/(?:baz|en|ppp)\/[\w-]+\/.*$
^
字符串开始[^\\/]+
匹配 1+ 次除/
之外的任何字符\\/
匹配/
(?:test|foo|bar)
匹配 1 个选项\\/
匹配/
(?:baz|en|ppp)
匹配 1 个选项\\/
匹配/
[\\w-]+
匹配 1+ 次一个单词 char 或-
\\/
匹配/
.*
匹配 0+ 次出现的任何字符,除了换行符$
字符串结尾使用负前瞻或后视将解决您的问题。 问题中有两个选项不清楚:
?uid=100
在起始部分/bar/baz
之后是不允许的,所以www.mysite.com/test/bar/baz?uid=100
应该是有效的。?uid=100
是不允许的字符串中的任何下列/bar/baz
,这意味着www.mysite.com/test/bar/baz/?uid=100
是以及无效。选项1
简而言之:
\/(test|foo|bar\/baz(?!\/?\?)|en|ppp)(\/[-\w?=]+)*\/?
重要部分说明:
| # OR
bar # 'bar' followed by
\/ # '/' followed by
baz # 'baz'
(?! # (negative lookahead) so, **not** followed by
\/? # 0 or 1 times '/'
\? # '?'
) # END negative lookahead
和
( # START group
\/ # '/'
[-\w?=]+ # any word char, or '-','?','='
)* # END group, occurrence 0 or more times
\/? # optional '/'
示例选项 1
您可以使用诸如(?!\\/?\\?\\w+=\\w+)
类的内容使前瞻更加具体,以明确不允许?a=b
,但这取决于您。
选项 2
为了明确指出?a=b
不允许在任何我们可以使用负回顾的地方。 让我们先找到一个解决方案,不允许* bar/baz
前的?a=b
。
速记:
(?<!bar\/baz\/?)\?\w+=\w+
解释:
(?<! # Negative lookbehind: do **not** match preceding
bar\/baz # 'bar/baz'
\/? # optional '/'
)
\? # match '?'
\w+=\w+ # match e.g. 'a=b'
让我们把这部分作为完整的正则表达式:
\/(test|foo|en|ppp|bar\/baz)(\/?((?<!bar\/baz\/?)\?\w+=\w+|[-\w]+))*\/?$
解释:
\/ # match '/'
(test|foo|en|ppp|bar\/baz) # start with 'test', 'foo', 'en', 'ppp', 'bar/baz'
(\/? # optional '/'
((?<!bar\/baz\/?)\?\w+=\w+ # match 'a=b', with negative lookbehind (see above)
| # OR
[-\w]+) # 1 or more word chars or '-'
)* # repeat 0 or more times
\/? # optional match for closing '/'
$ # end anchor
示例选项 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.