js 正则表达式学习笔记
正则表达式
正则表达式是由一个字符序列形成的搜索模型
语法
new RegExp("[abc]")
/[abc]/
/正则表达式主体/修饰符(可选)
1.修饰符
i 忽略大小写
g 执行全局匹配 //global
m 执行多行匹配
2.表达式
[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符
[0-9] 查找任何从0至9的数字
[a-z]查找任何从小写a到小写z的字符
(x|y) 查找任何|分割的选项
3.元字符
. 查找任意的单个字符,除了换行符外
\d 查找数字 === [0-9] digit(数字)
\D查找非数字 === [^0-9]
\s 查找空白字符 space
\b 匹配一个单词边界,也就是指单词和空格间的位置,比如’er\b’可以匹配”never”中的”er”,但是不能匹配”verb”中的”er”
\w 查找任意一个字母或数字或下划线,等价于[a-zA-Z0-9_] word
\uxxxx 查找以十六进制xxxx规定的Unicode字符
匹配任何字符 [\d\D]或[\w\W]或[\s\S]或[^]
4.量词
n+ 匹配任何包含至少一个n的字符 === n{1,}
n* 匹配任何包含零个或多个n的字符串 === n{0,}
n? 匹配任何含零或一个n的字符串 === n{0,1 }
?=n 匹配任何其后紧接指定字符串n的字符串,不包含n, 就是n前面的那个位置
?:n 匹配任何其后紧接指定字符串n的字符串,包含n
?!n 匹配任何其后没有紧接指定字符串n的字符串
(?<!exp)"匹配前面不是exp的位置;如:/(?!<\d)123/.exec("abc123 ") //["123", index: 3, input: "abc123 "]
^n 匹配任何开头为n的字符串
n$ 匹配任何结尾为n的字符串
/\d{2,5}?/ 表示,虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了
(?!^)表示不是开头位置
5. 方法
1)String对的方法
str.search(/表达式/) 返回匹配到的第一个位置
str.split(/表达式/)
str.match(/表达式/)
str.replace(/表达式/,'')
2)RegExp对象方法
/表达式/.test(str) 返回布尔值
/表达式/.exec(str) 返回一个数组,存放匹配的结果,如果未找到匹配,则返回值为null
6.$
1、 2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串
$` 位于匹配子串左侧的文本
$' 位于匹配子串右侧的文本
$$ 直接量符号
//第一种情况:
'aa11AA'.replace(/([a-z]+)(\d+)([A-Z]+)/g, '$1'); // "aa"
'aa11AA'.replace(/([a-z]+)(\d+)([A-Z]+)/g, '$2'); // "11"
'aa11AA'.replace(/([a-z]+)(\d+)([A-Z]+)/g, '$3'); // "AA"
//猜想 如果是 $4 回事什么呢? undefined ?
'aa11AA'.replace(/([a-z]+)(\d+)([A-Z]+)/g, '$4'); // "$4"
//所以,要是没有该子项,则当成普通字符串处理了
//第二种情况:
'aa11AA'.replace(/([a-z]+)(\d+)([A-Z]+)/g, '$&'); //"aa11AA"
//第三种情况:
'aa11AA'.replace(/(\d+)/g, '$`'); //"aaaaAA"
//第四种情况:
'aa11AA'.replace(/(\d+)/g, "$'"); //"aaAAAA"
//第五种情况:
'aa11AA'.replace(/(\d+)/g, '$$'); //"aa$AA"
7.懒惰限定符(贪婪模式加?变为非贪婪模式)
"*?" 重复任意次,但尽可能少重复;如:"aabab".match(/a.*?b/)
// ["aab"] 为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?
简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权。
"+?" 重复1次或更多次,但尽可能少重复,与上面一样,只是至少要重复1次。如:"aabab".match(/a.+?b/)
// ["aab"]"??" 重复0次或1次,但尽可能少重复。如:"aabab".match(/a.??b/)
// ["aab"]
"{n,m}?" 重复n到m次,但尽可能少重复。如:"aaa".match(/a{1,3}?/)
// ["a"]
"{n,}?" 重复n次以上,但尽可能少重复。如:"aaa".match(/a{1,}?/)
// ["a"]
8.需要转义的字符
* . ? + $ ^ [ ] ( ) { } | \ /
9. 临时缓存区
正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。
对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。
(可以使用非捕获元字符 '?:', '?=', 或 '?!' 来忽略对这部分正则表达式的保存。)
所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。
存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。
每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/
判断是否为yyyy-mm-dd格式的类型
\2 这里是匹配 (-|\/) 这里的字符,也就是,如果前面用了 - ,那这里也匹配 -,如果前面是 / ,那这里也匹配 /
/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/ === /^(\d{1,4})(-|\/)(\d{1,2})\2\3$/
10.应用
1)获取urlhttps://www.baidu.com?name=james&age=28里age的值
function getParamName(attr) {
let search = window.location.search,
match = RegExp(`[?&]${attr}=([^&]*)`).exec(search);
return match && decodeURIComponent(match[].trim());
}
getParamName('age')//28
2)数字格式化问题
let str = ''
let format = str.replace(/\B(?=(\d{})+(?!\d))/g, ',')
console.log(format) // 1,234,567,890
01 /\B(?=(\d{3})+(?!\d))/g:正则匹配边界\B,边界后面必须跟着(\d{3})+(?!\d);
02 (\d{3})+:必须是1个或多个的3个连续数字;
03 (?!\d):第2步中的3个数字不允许后面跟着数字;
04 (\d{3})+(?!\d):所以匹配的边界后面必须跟着3*n(n>=1)的数字。
参考地址:
1.http://www.cnblogs.com/tugenhua0707/p/5037811.html
2.https://segmentfault.com/a/1190000009590458
3.https://github.com/jawil/blog/issues/20
js 正则表达式学习笔记的更多相关文章
- js再学习笔记
#js再学习笔记 ##基本 1.js严格区分大小写 2.js末尾的分号可加,也可不加 3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...
- JS数组学习笔记
原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- javascript正则表达式 - 学习笔记
JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...
- JS正则表达式学习记录
JS:正则表达式学习记录 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 小菜鸡学习---<正则表达式学习笔记2>
正则表达式学习笔记2 一.修饰符 前面我们学习的都是用于匹配的基本的关键的一些表达式符号,现在我们来学习修饰符.修饰符不写在正则表达式里,修饰符位于表达式之外,比如/runoob/g,这个最后的g就是 ...
- Knockout.js快速学习笔记
原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...
- JS&ES6学习笔记(持续更新)
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
随机推荐
- hdu5325 树的思维题
pid=5325">http://acm.hdu.edu.cn/showproblem.php? pid=5325 Problem Description Bobo has a tre ...
- winserver 资源下载
http://msdn.itellyou.cn/ 下载各种系统资源,支持迅雷下载,速度杠杠的
- Pentaho BIServer Community Edtion 6.1 使用教程 第一篇 软件安装
一.简介: Pentaho BI Server 分为企业版和社区版两个版本.其中 社区版 CE(community edtion) 为免费版本. 二.下载CE版(CentOS): 后台下载命令: no ...
- 前端JSONPJIE解决跨域问题
解决同源策略的两个方法 1 . JSONP jsonp (将 JSON 数据填充进回调函数,这就是JSONP的JSON+Padding 的含义) jsonp是json用来跨域的一个东西,原理是通过sc ...
- 话说文件系统——aufs源码分析(三)【转】
本文转载自:http://www.cnblogs.com/xie0812/p/8848185.html 1. linux中设备驱动的入口都是:module_init(xxx_init);里面注册的函数 ...
- HDU3336 Count the string —— KMP next数组
题目链接:https://vjudge.net/problem/HDU-3336 Count the string Time Limit: 2000/1000 MS (Java/Others) ...
- Spring Boot2.0之多环境配置
本地开发环境 测试环境 实际项目中 区分不同的环境配置文件信息 首先创建三种不同场景下的配置文件: 内容分别是: ###dev http_url="dev" ###prdhttp_ ...
- VLAN虚拟局域网技术(三)-计算机网络
本文主要知识来源于学校课程,部分知识来自于H3C公司教材,未经许可,禁止转载.如需转载,请联系作者并注明出处. 本节主要介绍 pVLAN和 动态VLAN. 1. pVLAN:英文全称Private ...
- 轻量级RPC框架开发
nio和传统io之间工作机制的差别 自定义rpc框架的设计思路 rpc框架的代码运行流程 第2天 轻量级RPC框架开发 今天内容安排: 1.掌握RPC原理 2.掌握nio操作 3.掌握netty简单的 ...
- BZOJ 1660 [Usaco2006 Nov]Bad Hair Day 乱发节:单调栈
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1660 题意: 有n头牛,身高分别为h[i]. 它们排成一排,面向右边.第i头牛可以看见在它 ...