正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

Posted

技术标签:

【中文标题】正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性【英文标题】:Regex to match specific URL fragment and not all other URL possibilities 【发布时间】:2019-12-31 13:48:40 【问题描述】:

我有 - 比如说 - example.com 网站,我有 account 页面。 它可能有 GET 参数,这也被认为是帐户页面的一部分。 它也可能有 URL 片段。如果是home.html 片段 - 它仍然是帐户页面。如果另一个片段 - 那么它是帐户页面的不同子页面。

所以 - 我需要一个 RegEx (JS) 来匹配这种情况。到目前为止,这是我设法构建的:

example.com\/account\/(|.*\#home\.html|(\?(?!.*#.*)))$

https://regex101.com/r/ihjCIg/1

前 4 个是我需要的案例。如您所见 - 第二行与我的 RegEx 不匹配。

我在这里错过了什么?

【问题讨论】:

您可能对window.location 对象感兴趣,您可以在其中检查pathnamehash 而无需担心参数。但是,如果您需要,可以在search 中找到这些参数。 要排除最后两种情况吗? 这发生在第 3 方工具中,否则我只会检查路径名和散列,并会处理我想要的所有情况 :) 您是否正在寻找类似的东西Regex 【参考方案1】:
example\.com\/account\/((\??[^#\r\n]+)?(#?home\.html)?)?$

这匹配你的前四个字符串

example.com/account/
example.com/account/?brand=mine
example.com/account/#home.html
example.com/account/?brand=mine#home.html

并且不包括你的最后两个

example.com/account/#other.html
example.com/account/?brand=mine#other.html

【讨论】:

【参考方案2】:

您可以创建 2 个可选组,1 个可选匹配 ? 并匹配除 # 和另一个可选组匹配 #home.html 之外的任何字符

注意转义点以匹配它的字面意思。

^example\.com\/account\/(?:\?[^#\r\n]*)?(?:#home\.html)?$
^ 字符串开始 example\.com\/account\/比赛开始 (?:非捕获组 \?[^#\r\n]* 匹配 ? 和 0+ 次除 # 或换行符以外的任何字符 )?关闭组并使其成为可选 (?:非捕获组 #home\.html匹配#home.html )? 关闭群组并将其设为可选 $

Regex demo

let pattern = /^example\.com\/account\/(?:\?[^#\r\n]*)?(?:#home\.html)?$/;
[
  "example.com/account/",
  "example.com/account/?brand=mine",
  "example.com/account/#home.html",
  "example.com/account/?brand=mine#home.html",
  "example.com/account/#other.html",
  "example.com/account/?brand=mine#other.html"
].forEach(url => console.log(url + " --> " + pattern.test(url)));

【讨论】:

不太确定 xyz.com/?#123 是否是有效的 url 架构,如果不是,我们可能需要将 * 量词替换为 + 并考虑使用类似 queryName=queryValue 的结构,无论如何+1 @CodeManiac 我明白你的意思。在这种情况下,它仅适用于广泛匹配,它可能会匹配更多有问题的 url 格式。在那种情况下,我认为 OP 允许的一组特定字符会更好。 是的,完全同意你的看法,正则表达式只能处理指定的,更通用的是我们应该总是更喜欢 URL api :)【参考方案3】:

您组中的第三种选择具有否定的前瞻性,以确保它拒绝任何包含# 的文本,但您没有特别提到任何应该与其余内容匹配的内容,直到行尾。检查这个更新的正则表达式演示,

https://regex101.com/r/ihjCIg/3

如果您注意到,我已经在 com 之前转义了您的第一个点,并在否定前瞻部分之后添加了 .*,以便它与您的第二个示例匹配。

【讨论】:

但我在# 之后有.* ...我认为这是处理其余字符,直到URL 结束... @peshohristov:好的,在# 之后的.* 只需要从负前瞻中取出,它会像你预期的那样工作。检查这个更新的链接regex101.com/r/ihjCIg/6 感谢您的解释,这很有用:)

以上是关于正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

正则表达式的贪婪和非贪婪模式

如何使用正则表达式匹配所有数字字符和一些单个字符

正则表达式,匹配特定字符后面的内容

java 正则匹配字符是不是为纯数字

正则表达式匹配域名网址url