题解 | #合法的URL#
合法的URL
https://www.nowcoder.com/practice/81982d7a36aa436fa9143c8b4f5ea1a3
这道题真的很考验正则表达式的熟练度(反正我是很不熟),首先要知道合法的 URL 是什么样的:
合法的 URL 结构
一个合法的 URL 包括以下几个基本部分:
- 协议部分:URL 以协议开头,通常是 http://、https://、ftp:// 等。协议部分是可选的,但如果存在,则必须以 :// 结尾。
- 域名部分:域名由多个子域名(例如 www、blog 等)和一个顶级域名(如 .com、.net、.org)组成。每个子域名和顶级域名之间用 . 分隔。
- 端口部分(可选):如果 URL 指定了端口,格式为 :数字,例如 :8080。
- 路径部分(可选):表示在服务器上资源的具体位置。路径以 / 开头。
- 查询参数部分(可选):用 ? 开始,参数之间用 & 分隔,每个参数由键值对组成,例如 ?name=John&age=30。
- 哈希部分(可选):用 # 开始,通常用于页面内跳转或锚点。
示例
一个典型的合法 URL 可以是:
https://www.example.com
http://subdomain.example.com:8080/path/to/resource?query=string#section
接下来让我们一个部分一个部分的拆解:
开始符 ^ 协议部分http(s):// 表示为((https|http|ftp|rtsp|mms)?:\/\/) 域名部分 表示为(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+ 顶级域名com cn等为2-6位 表示为([a-zA-Z]{2,6}) 端口部分 表示为(:\d+)?, ?表示0次或1次 请求路径如/login 表示为 (\/.*)? 问号传参及哈希值如?age=1 表示为 (\?.*)?和(#.*)? 结束符 $
注意:
- 在正则表达式中,斜杠
/
是用来包裹正则表达式的开始和结束的符号。如果你想要匹配字符串中的某些特殊字符(比如:
和/
),但又不想让它们被误解为正则表达式的符号,可以使用反斜杠\
进行转义。具体来说,?:\/\/
中的\
是用来转义后面的/
符号,确保它被当作普通的字符处理。而\/
的作用是匹配字符串中的/
字符。在正则表达式中,常见的需要转义的特殊字符包括.
、*
、+
、?
、|
、()
、[]
、{}
等,这些字符在正则表达式中具有特殊的含义,如果要匹配它们本身,需要使用\
进行转义。因此,?:\/\/
的意思是匹配://
,其中:
是普通字符,而\/
是用来匹配字符串中的/
。 (([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+
匹配域名部分,可以由多个子域名和顶级域名组成。([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)
匹配一个子域名,可以包含字母、数字和连字符-
。\.
匹配.
字符。+
表示前面的表达式至少出现一次。- 正则表达式中使用
|
符号表示逻辑上的或操作。在[A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+
这个表达式中:
[A-Za-z0-9]+-[A-Za-z0-9]+
表示匹配一个由连字符-
分隔的子域名部分,例如abc-def
。[A-Za-z0-9]+
表示匹配一个不包含连字符-
的子域名部分,例如abc123
。
这两部分通过 |
分隔,表示匹配其中任意一种情况。正则表达式引擎会尝试依次匹配每个选项,如果第一个选项匹配成功,就不会尝试后面的选项。
// 补全代码 const _isUrl = url => { // 补全代码 let reg = /^((https|http|ftp|rtsp|mms)?:\/\/)(([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+)\.)+([A-Za-z]{2,6})(:\d+)?(\/.*)?(\?.*)?(#.*)?$/ return reg.test(url) }
手撕题题库 文章被收录于专栏
这是我开卷的第一步!!