js正则表达式详解-子匹配 匹配原理 例子讲解
2017-07-25 14:42
549 查看
博主之前认为已经掌握了正则,但是最近在解析url的各项时,才发现正则表达式的博大精深,下面博主将通过一个很好的例子来讲解正则表达式的匹配过程,其他博客都不会有,希望对像我一样对技术热爱的人有帮助~
例子如下:
解析 URI:输入一个 URI,输出一个 object,请用 JavaScript 解析 URI,并把解析出来的各个 部分存在一个 object 对象中返回。需要解析的部分包括:
scheme:协议,字符串类型;
host:主机名/IP,字符串类型;
port:端口,整数类型; path:路由,字符串类型; queries:请求参数,object 类型,存键值对; hash:字符串类型;
例如,给定 URI 为 https://www.example.com:8080/a/b/c?q=234&p=abc#header,返回: {
“scheme”: “https”,
“host”: “www.example.com”,
“port”: 8080,
“path”: “/a/b/c”,
“queries”: {
“q”: “234”,
“p”: “abc” },
“hash”: “header” }
下面是我的代码:
有点编程基础的小伙伴应该能看懂吧 (逃~
下面就重点说一下其中的正则吧~
首先说明一下子匹配的原理:
()里面的内容表示子匹配
(?: )表示这个括号中的子匹配不返回结果
下面是各个匹配:
我用空格分开了匹配的各个部分,应该一眼就能看出原理,就不细说了~
1)https:
(?:)表示这个括号表示的子匹配最后不存在结果中, 要加这个最外层括号原因是url开头的http是可以不要的
2)//
3)www.example.com
4) :8080
整个:80都是可有可无的
5)/a/b/c
6)?name=1&dd=ddd**
8)#header
例子如下:
解析 URI:输入一个 URI,输出一个 object,请用 JavaScript 解析 URI,并把解析出来的各个 部分存在一个 object 对象中返回。需要解析的部分包括:
scheme:协议,字符串类型;
host:主机名/IP,字符串类型;
port:端口,整数类型; path:路由,字符串类型; queries:请求参数,object 类型,存键值对; hash:字符串类型;
例如,给定 URI 为 https://www.example.com:8080/a/b/c?q=234&p=abc#header,返回: {
“scheme”: “https”,
“host”: “www.example.com”,
“port”: 8080,
“path”: “/a/b/c”,
“queries”: {
“q”: “234”,
“p”: “abc” },
“hash”: “header” }
下面是我的代码:
function getQueryItems(url){ var reg = /^(?:([A-Za-z]+):)?(?:\/{0,3})([A-Za-z.\-0-9]+)(?::(\d+))?(\/[^#?]*)?(?:\?([^#]*))?(?:#(.*))?$/; var result = url.match(reg); //result中存储分解下来的结果 console.log(result); var output = {}; //返回的结果 var item = ["scheme","host","port","path","queries","q","p","hash"]; //由于得到的键值对需要单独处理,所以先赋值前四项 for(var i=1;i<5;i++){ output[item[i-1]] = result[i]; } //分解键值对 var queries = result[5]; //queries存储得到的键值对 var keyValues = queries.split("&"); //keyValues存储进一步分解结果 ["q=234", "p=abc"] var querySplit = {}; //存储得到的键和值对象 {q: "234", p: "abc"} for(let j=0;j<keyValues.length;j++){ querySplit[keyValues[j].split("=")[0]] = keyValues[j].split("=")[1]; } output["queries"] = querySplit; //将id加到对象中 output["hash"] = result[6]; console.log(output); } getQueryItems("https://www.example.com:8080/a/b/c?q=234&p=abc#header")
有点编程基础的小伙伴应该能看懂吧 (逃~
下面就重点说一下其中的正则吧~
首先说明一下子匹配的原理:
()里面的内容表示子匹配
(?: )表示这个括号中的子匹配不返回结果
下面是各个匹配:
我用空格分开了匹配的各个部分,应该一眼就能看出原理,就不细说了~
1)https:
(?: ([A-Za-z]+) : )?
(?:)表示这个括号表示的子匹配最后不存在结果中, 要加这个最外层括号原因是url开头的http是可以不要的
2)//
\/{0,3}
3)www.example.com
([A-Za-z\.0-9]+)
4) :8080
(?: (:[0-9]+) )?
整个:80都是可有可无的
5)/a/b/c
(?: \/[^#?]* )*
6)?name=1&dd=ddd**
(?: \? ([^#]*) )?
8)#header
(?: #(.*) )?
相关文章推荐
- JS正则表达式一条龙讲解(从原理和语法到JS正则)
- JS中正则表达式全局匹配模式 /g用法详解
- 详解正则表达式匹配算法原理
- JS中正则表达式只有3种匹配模式(没有单行模式)详解
- js正则表达式之search方法讲解
- 详解JavaScript正则表达式之分组匹配及反向引用
- js 正则表达式详解
- JS 的几个简单正则匹配例子和 mysql 的一个正则匹配例子
- Scala - 正则表达式匹配例子
- 史上最全的正则表达式多行匹配例子 from karlzheng@csdn
- (转)js 正则表达式之test函数讲解
- JS正则表达式详解
- js正则表达式(简单例子)
- 从一个匹配数字和字母密码的正则表达式的例子到零宽断言
- JS常用的匹配正则表达式和实例
- JS正则表达式详解
- JS正则表达式详解
- js 正则表达式 匹配除汉字,字母,数字,逗号,句号外的特殊字符(用来规范输入内容)