使用正则表达式匹配特定路径和特定查询参数

3

我在尝试创建正则表达式,匹配带有查询参数可能位于任何位置的URL路径。

例如,URL可以是:

/page?foo=bar&target=1&test=1 <- should match
/page?target=1&test=2 <- should match
/page/nested?foo=bar&target=1&test=1 <- should NOT match
/page/nested?target=1&test=2 <- should NOT match
/another-page?foo=bar&target=1&test=1 <- should NOT match
/another-page?target=1&test=2 <- should NOT match

我需要在/page上特定地定位参数target,涉及到IT技术相关内容。这个正则表达式只能找到参数\A?target=[^&]+&*

谢谢!

更新:这是为第三方工具准备的,该工具将决定在哪个页面上运行实验。它仅接受在其仪表板上设置的正则表达式,因此无法使用URL解析器等代码工具。


/page?.*target=([^&]+)它将匹配第1组中的target内容,本例中为“1” - YOGO
2个回答

5

通常情况下,如果您想解析参数,请使用URL解析器而不是自定义正则表达式。

在这种情况下,您可以使用以下方法:

# http://a.b/ is just added to make URL parsing work
url = new URL("http://a.b/page?foo=bar&target=1&test=1")
url.searchParams.get("target")
# => 1
url.pathname
# => '/page'

然后在if语句中检查这些值:

url = new URL("http://a.b/page?foo=bar&target=1&test=1")

url = new URL("http://a.b/page?foo=bar&target=1&test=1")
if (url.searchParams.get("foo") && url.pathname == '/page' {
  # ...
}

参考文献:

编辑

如果你必须使用正则表达式,请尝试这个:

\/page(?=\?).*[?&]target=[^&\s]*(&|$)

演示

解释:

  • \/page(?=\?) - 匹配路径(以/开头,然后是page,然后是对?的前瞻)
  • .*[?&]target=[^&\s]*($|&) 匹配参数名为target
    • 可以位于任何位置(使用通配符.*匹配任何字符)
    • [?&]前缀为?&
    • 后跟其值(=后面的[^&\s]*)
    • 以参数结尾($)或另一个参数开始(&

这是一个工具所需的内容,该工具将决定在哪个页面运行实验。它只接受在他们的仪表板上进行设置。 - Kosmetika
所以我在这里没有选择。 - Kosmetika
更新后的正则表达式将匹配带有两个“?”的/page?foo=bar?target=1&test=1 - anubhava
你是什么意思?难道不应该匹配吗? - mrzasa
1
@Kosmetika - 你应该编辑你的问题,并在其中更新这些评论中的信息。mrzasa建议使用new URL是最自然的回应,因为你的问题没有提到阻止你这样做的限制。 - Stephen P
显示剩余2条评论

1

If you're looking for a regex then you may use:

/\/page\?(?:.*&)?target=[^&]*/i

正则表达式演示

正则表达式细节:

  • \/page\?:匹配文本/page?
  • (?:.*&)?:匹配可选的任意长度的文本,后跟&
  • target=[^&]*:匹配文本target=,后跟0个或多个非&字符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接