簡體   English   中英

正則表達式將帶有參數的 url 匹配到特定模式而不是查詢字符串

[英]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))
您可以對此進行測試並在Regex101 中進一步發揮作用 更重要的是,如果您使用該頁面,它會告訴您正則表達式字符串中的內容。

如果這不是您所要求的,那么還有另一個與您相關的問題,沒有正則表達式:這里是

對於 2 個示例字符串,您可以使用

^[^\/]+\/bar\/baz\/[\w-]+\/.*$

正則表達式演示

如果你也想使用交替,它可能看起來像

^[^\/]+\/(?:test|foo|bar)\/(?:baz|en|ppp)\/[\w-]+\/.*$
  • ^字符串開始
  • [^\\/]+匹配 1+ 次除/之外的任何字符
  • \\/匹配/
  • (?:test|foo|bar)匹配 1 個選項
  • \\/匹配/
  • (?:baz|en|ppp)匹配 1 個選項
  • \\/匹配/
  • [\\w-]+匹配 1+ 次一個單詞 char 或-
  • \\/匹配/
  • .*匹配 0+ 次出現的任何字符,除了換行符
  • $字符串結尾

正則表達式演示

使用負前瞻或后視將解決您的問題。 問題中有兩個選項不清楚:

  1. ?uid=100在起始部分/bar/baz之后是不允許的,所以www.mysite.com/test/bar/baz?uid=100應該是有效的。
  2. ?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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM