【问题标题】:Regex to match url with one or two segment paths正则表达式将 url 与一个或两个段路径匹配
【发布时间】:2019-07-21 13:58:10
【问题描述】:

我有以下 url/path 结构。我需要一个正则表达式来匹配前两行。如果 url 中有第三条路径,则正则表达式不应匹配。

想法?

http://somewebsite.foo/aaa
http://somewebsite.foo/aaa/bbb
http://somewebsite.foo/aaa/bbb/ccc

【问题讨论】:

  • 嘿 OP,你能发布你到目前为止尝试过的模式吗?
  • /\/aaa(\/.*|)/g - 匹配所有 3 个
  • 尝试使用带有可选第二部分的匹配 ^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$ 参见 demo

标签: javascript regex nsregularexpression


【解决方案1】:

您不需要正则表达式,您可以使用URLsplit

let a = 'http://somewebsite.foo/aaa'
let b = 'http://somewebsite.foo/aaa/bbb'
let c = 'http://somewebsite.foo/aaa/bbb/ccc'

let test = (input) => {
  return new URL(input).pathname.split('/').length < 4
}

console.log(test(a))
console.log(test(b))
console.log(test(c))

【讨论】:

  • 好办法,但恐怕我必须使用正则表达式作为输入
【解决方案2】:

您获得 3 个匹配项,因为您的正则表达式 \/aaa(\/.*|) 匹配 3 次 a 并捕获正斜杠后跟从 /aaa 匹配的捕获组中的任何字符,直到字符串结尾。

要匹配完整的 url,您可以匹配 url 的开头并使用否定字符类 [^\/] 不匹配正斜杠并使第二部分可选。

^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$
  • ^https?:\/\/匹配url的开头
  • [^\/]+\ 匹配 1+ 次而不是正斜杠
  • /[^\/]+ 匹配第一个 / 后跟不匹配 /
  • (?:\/[^\/]+)? 只是这次再次使用相同的模式,通过使用非捕获组使其成为可选
  • $字符串结束

regex101 demo

或者如果它应该是 aaa 和 bbb 使用:

^https?:\/\/[^\/]+\/aaa(?:\/bbb)?$

[
  "http://somewebsite.foo/aaa",
  "http://somewebsite.foo/aaa/bbb",
  "http://somewebsite.foo/aaa/bbb/ccc"
].forEach(x => console.log(x + " ==> " + /^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$/.test(x)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多