文档章节

js正则表达式

o
 osc_1ee7cxmx
发布于 2018/08/06 21:13
字数 1738
阅读 0
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

js正则表达式

从本周开始我将按时发表我的日志,每周一篇原创,日志内容主要是计算机知识,偶尔也会有电学内容;下面是第一篇内容,之所以第一周选正则表达,是因为我上周系统的学习了一下


什么是正则

一般是用特殊的符号来定义的字符串规则,表达了某种字符串规则,比如可以用来校验电话号码,邮箱,身份证号等…… 写好的正则表达式一般很难看的懂 文本编辑软件中使用正则表达来查找、替换能大大的提高效率


文本编辑软件中使用

文本编辑器的使用可以参考下面js中的的规则 如在 vs code中使用它来查找邮箱: 邮箱正则表达.gif


js中正则:

在js中正则用对象表达:

RegExp对象   写法有两种:

js风格 let regExp = new RegExp("a","i") perl风格 let regExp = /a/i 一般使用Perl风格

  1. js中常用的正则:
元字符/表达式 描述
/a/i a表示匹配a字符i表示忽略大小写;
/\d/g \d匹配所有数字0-9;g找到全部如果不加g找到一个就返回;
/\d+/g +表示多少位都可以;
/a|c|/ 匹配a或者c;
/[abc]de/g 匹配ade或bde或cde
/[a-z]/ 匹配所以字母
/[0-9]/ 匹配所以数字
/[^abc]/ 匹配非a、b、c 的字符;
/./ 匹配任意字符 一般不用

<br/>

正则贪婪 匹配最长字符:比如<br/>

//匹配标签
let re=/<.+>/g;

let string="<html><body>哈哈哈</body></html>"
//re匹配string将匹配所有字符,因为这段字符中首位分别为<和>;
//正确写法
let re=/<[^<>].+>/g;//刨除标签中的“<”和“>”
let string="<html><body>哈哈哈</body></html>"

  1. 常用转义字符
常用转义字符 >
\d 数字 等价于:[0-9]
\w 英文、数字、下划线 等价于:[a-z0-9_]
\s 空白字符
\D 非数字 等价于:[^0-9]
\W 非英文、数字、下划线 等价于:[^a-z0-9_]
\S 非空白字符
. 任意字符(一般不用)
^ 行首
& 行位
  1. 量词
正则中的量词 >
{n} 正好出现n次
{n,m} 最少n次,最多m次
{n,} 最少n次,不限最多次
+ 最少1次,不限制最多次 等价于:{1,}
? 最少一次0次最多1次,可有可没有; 等价于:{0,1}
* 可有没有,也可以有无穷多位; 等价于:{0,}(一般不用)
  1. js中常用的正则方法
  • Srting.prototype.search()方法

用来找出原字符串中首次出现匹配正则的位置(index),没有则返回-1

"hello 发挥不广泛".search(/发挥不广泛/);  //  6
  • Srting.prototype.test()方法

用来测试字符串中是否含有子字符串

/hello/.test("hello 发挥不广泛");  //  true
  • Srting.prototype.split()方法

用来分割字符串

"发挥不广泛Hi张三Hi李四".split(/Hi/);    //  ["发挥不广泛","张三","李四"]
  • Srting.prototype.replace()方法

用来替换字符串中的子串

"hello 发挥不广泛".replace(/hello/,"hi");  //  "hi 发挥不广泛"

也可以将匹配到的字符串分组,并根据分组有选择的替换内容,分组用“()”来确定,用$1表示第一个分组$2表示第二个分组,以此类推,(注意:不是从$0开始) 比如将今天日期字符串“2018年07月26日”换成“26-07-2018”

"2018年07月25日".replace(/(2018)年(07)月(26)日/,"\$3-\$2-\$1")    //  26-07-2018
"2018年07月25日".replace(/(\d{4})年(\d{2})月(\d{2})日/,"\$3-\$2-\$1")    //  26-07-2018
  • Srting.prototype.match()方法

用来捕获字符串中的子字符串到一个数组中。默认情况下只捕获一个结果到数组中,定义正则表达式的时候添加参数g时,会捕获所有结果到数组中

"发挥不广泛Hi张三Hi李四".match(/Hi/); //  ["Hi"]
"发挥不广泛Hi张三Hi李四".match(/Hi/g); //  ["Hi","Hi"]

当正则表达式没有全局属性(没有g参数)时,且有分组时match()方法只会返回整个匹配的第一个结果,同时还会把分组匹配到的字符串放到数组中:

"发挥不广泛Hi张三Hi李四".match(/Hi(张三)Hi(李四)/)    // ["Hi张三Hi李四","张三","李四"]

用它来解析URL很好用

let url = "https://www.machuang.wang:8080/js/jq.js?id=01";
let re = /^((\w+):\/\/([\w\.]+)):([\w\.]+)\/([^?]+)\?(\S+)$/
let urlArr = url.match(re);
console.log(urlArr);    //  结果见下图

url解析.png

  • Srting.prototype.exec()方法

1.exec函数在正则表达式中有分组的情况下,表现和match函数很像,只是无论正则表达式是否有全局属性,exec函数都只返回一个结果,并捕获分组的结果

 /Hi/g.exec("发挥不广泛Hi张三Hi李四")   //  [Hi]
 /(H)i/g.exec("发挥不广泛Hi张三Hi李四") //  [Hi,H]

2.正则表达式对象(即js中的RegExp对象)有一个lastIndex属性,用来表示下一次从哪开始捕获,每执行一次exec()方法后,lastIndex就会向后推,直到找不到匹配的字符时返回null,然后再从头开始继续捕获。用这个可以遍历捕获的字符串中的子串。

let re = /Hi/g;
let string = "发挥不广泛Hi张三Hi李四"
(function(){
    console.log(re.lastIndex);      //  0
    console.log(re.exec(string));   //  [Hi]
    console.log(re.lastIndex);      //  7
    console.log(re.exec(string));   //  [Hi]
    console.log(re.lastIndex);      //  11
    console.log(re.exec(string));   //  null
    console.log(re.lastIndex);      //  0
})()

exec()方法.png


手机号邮箱正则表达式分析

  1. 手机号正则表达式分析 手机号为11位数字(不讨论 +86) 我目前了解的手机号第一位只能是1,第二位只能是3、5、7、8;
11手机号 第1位 第2位 第3~11位
可能数字 1 3、5、7、8 0~9
正则表达式 1 [3578] \d{9}

根据以上表格匹配手机号正则为: 1[3578]\d{9} 电话号码匹配.gif 在js中匹配手机号通常是用于校验手机号,最常见的就是校验用户输入的手机号格式是否正确,如果按上面的格式书写则:

let shoujihao1 = "jlagjlafgl13645130956235jljglj";
let shoujihao2 = "13645130956";
let re = /1[3578]\d{9}/;
console.log(re.test(shoujihao1)) //true;
console.log(re.test(shoujihao2)) //true;

re.test(shoujihao1)也是true显然shoujihao不是一个正确的手机号所以加上行头行位校验,正则为:^1[3578]\d{9}$

let shoujihao1 = "jlagjlafgl13645130956235jljglj";
let shoujihao2 = "13645130956";
let re = /^1[3578]\d{9}$/;
console.log(re.test(shoujihao1)) //false;
console.log(re.test(shoujihao2)) //true;

  1. 邮箱正则表达式分析

邮箱的一般格式为:XXXXXXXX@XXXXX.XXXX.XXXX 我简单的以邮箱@前为任意数字、字母、、和-组成 |邮箱 |第一部分 |第二部分 |第三部分 |第四部分 |第五部分 |第六部分 |第七部分 |-- |-- |-- |-- |-- |-- |-- |--| |规则 |任意数字、任意字母、_、-|@ |任意数字、任意字母、_、-|. |无或者任意数字、任意字母、、-|.|2~6位的数字或字母| |正则表达式 |[0-9a-zA-Z-_]+ |@ |[0-9a-zA-Z-]+ |. |[0-9a-zA-Z-]*|. |[a-zA-Z0-9]{2,6}

匹配邮箱正则为:[0-9a-zA-Z_-]+@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*.[a-zA-Z0-9]{2,6}

同理在js在用于邮箱校验也要加上行头行尾校验……

20180726

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

聊聊dubbo-go的AccessLogFilter

序 本文主要研究一下dubbo-go的AccessLogFilter AccessLogFilter dubbo-go-v1.4.2/filter/filter_impl/access_log_filter.go type AccessLogFilter struct {logChan chan AccessLogData}......

go4it
昨天
24
0
对服务与工厂感到困惑 - Confused about Service vs Factory

问题: As I understand it, when inside a factory I return an object that gets injected into a controller. 据我了解,当在工厂内部时,我返回一个被注入控制器的对象。 When inside a ...

技术盛宴
昨天
25
0
OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
昨天
24
0
将向量附加到向量[重复] - Appending a vector to a vector [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: Concatenating two std::vectors 22 answers 连接两个std :: vectors 22个答案 Assuming I have 2 standa......

javail
昨天
19
0
获得所有文件夹的大小

有两个工具 https://www.getfoldersize.com/ http://www.uderzo.it/main_products/space_sniffer/index.html...

ethanleellj
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部