繁体   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