3

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

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

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

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

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

我在这里想念什么?

4

3 回答 3

3

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

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

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

正则表达式演示

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)));

于 2019-08-27T12:00:17.630 回答
1

您小组中的第三个备选方案具有负面展望,确保它拒绝任何包含 a#但您没有特别提到任何应该与其余内容匹配的内容,直到行尾。检查这个更新的正则表达式演示,

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

如果您注意到,我之前已经转义了您的第一个点,并在负前瞻部分之后com添加了它,因此它与您的第二个样本相匹配。.*

于 2019-08-27T11:40:49.697 回答
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
于 2019-08-27T11:44:56.987 回答