正则表达式匹配特定的 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
对象感兴趣,您可以在其中检查pathname
和hash
而无需担心参数。但是,如果您需要,可以在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 可能性的主要内容,如果未能解决你的问题,请参考以下文章