正则表达式以将网址与一两个分段路径匹配

时间:2019-02-27 18:37:25

标签: javascript regex nsregularexpression

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

有想法吗?

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

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

^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$
  • ^https?:\/\/匹配网址的开头
  • [^\/]+\匹配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)));