我有以下url / path结构。我需要一个正则表达式匹配前两行。如果url中有第3条路径,则正则表达式不匹配。
思考?
http://somewebsite.foo/aaa
http://somewebsite.foo/aaa/bbb
http://somewebsite.foo/aaa/bbb/ccc
你得到3个匹配,因为你的正则表达式\/aaa(\/.*|)
匹配3次a并且捕获正斜杠,然后是从/aaa
匹配到字符串结尾的捕获组中的任何字符。
要匹配完整的URL,您可以匹配URL的开头并使用否定的字符类[^\/]
来匹配不是正斜杠并使第二部分可选。
^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$
^https?:\/\/
匹配网址的开头[^\/]+\
匹配1次以上不是正斜杠/[^\/]+
匹配第一个/
,然后不是/
(?:\/[^\/]+)?
此时再次使用相同的模式,使用非捕获组使其成为可选模式$
字符串的结尾或者如果它应该是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)));