正则表达式匹配url与一个或两个段路径

问题描述 投票:-1回答:2

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

思考?

http://somewebsite.foo/aaa
http://somewebsite.foo/aaa/bbb
http://somewebsite.foo/aaa/bbb/ccc
javascript regex nsregularexpression
2个回答
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))

0
投票

你得到3个匹配,因为你的正则表达式\/aaa(\/.*|)匹配3次a并且捕获正斜杠,然后是从/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)));
© www.soinside.com 2019 - 2024. All rights reserved.