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 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
随机推荐
- 剑指Offer:删除链表的节点【18】
剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3-& ...
- JAVA源码分析------锁(1)
http://870604904.iteye.com/blog/2258604 第一次写博客,也就是记录一些自己对于JAVA的一些理解,不足之处,请大家指出,一起探讨. 这篇博文我打算说一下JAVA中 ...
- 6 《锋利的jQuery》Ajax的应用(略。)
Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高web程序的性能(传输数据的方式,按需发送) 4.减轻服务器和带宽的负担 Ajax的不足 1.浏览器对XMLHttpRequest对象支 ...
- php下载并安装pear脚本
下载并安装pear脚本cd /usr/local/php/bin/curl -o go-pear.php http://pear.php.net/go-pear.phar ./php go-pear. ...
- Eclipse的.properties文件输出中文成unicode编码
今天添加log4j.properties时,无法输入中文,输入的中文直接变成了unicode的编码形式.原因是Eclipse的.properties文件的默认编码为iso-8859-1. 选择Wind ...
- Spring Boot2.0之多环境配置
本地开发环境 测试环境 实际项目中 区分不同的环境配置文件信息 首先创建三种不同场景下的配置文件: 内容分别是: ###dev http_url="dev" ###prdhttp_ ...
- CSS+HTML+JQuery简单菜单
1. [代码]style <style type="text/css"> body,ul,li,a{ margin:0; paddin ...
- RQNOJ 569 Milking Time:dp & 线段问题
题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...
- 分享知识-快乐自己:Struts2框架 工作原理及执行流程图(拦截器的使用)
Struts2 架构图: 1):提交请求 客户端通过 HttpServletRequest 向 Servlet (即Tomcat)提交一个请求. 请求经过一系列的过滤器,例如图中的 ActionCon ...
- 阿里巴巴fastjson源码阅读(待完成)
git地址:https://github.com/alibaba/fastjson.git