[英]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.