正则表达式详解 js
前言
作为一个程序员,要出去装逼,手中必备的技能就是正则表达式。程序员的正则表达式,医生的处方和道士的鬼画符,都是利器。
在js中,很多的场景需要去使用到它(毕竟,js刚刚诞生的时候,是用来做表单等验证的)。其实,正则表达式是一门语言,有自己独特的语法,还拥有自己的解释器。但是,作为使用来说,我们只需要掌握它的语法,多多运用,才能熟练。其实,我想过很多种详解表达式的方式,但是,似乎每种方式都有缺陷,因为正则表达式的语法需要记忆的部分比较多。最后,我觉得可以通过比较和分类的方式去记忆。如果你喜欢我的文章,欢迎评论,欢迎Star~。欢迎关注我的github博客
正文
创建
在正则表达式中,有两种方式可以去创建正则表达式:
字面量
const reg = /abc/;复制代码
构造函数
const reg = new RegExp('abc');复制代码
对于这两种方式,如果正则表达式是静态的,那么,使用第一种字面量的方式,性能会比较好。但是,如果正则表达式是动态的,是根据变量来定义的,那么,只能使用第二种构造函数的方式。
语法
^ 和 $的对比
^:匹配字符串的行首。示例说明:
const reg = /^A/;console.log(reg.test('Ant')); //trueconsole.log(reg.test(' Ant')); //false复制代码
$:匹配字符串的行尾。示例说明:
const reg = /t$/;console.log(reg.test('eat')); //trueconsole.log(reg.test('enter')); //false复制代码
重复限定符(*、+、?、{n}、{n,}、{n, m})
*:匹配前一个字符0次或多次,(x >= 0)
const reg = /a*/;console.log(reg.test('ba')); //trueconsole.log(reg.test('b')); //trueconsole.log(reg.test('baaa')); //true复制代码
+:匹配前一个字符1次或多次,(x >= 1)
const reg = /a+/;console.log(reg.test('ba')); //trueconsole.log(reg.test('baaa')); //trueconsole.log(reg.test('b')); //false复制代码
?:匹配前一个字符的0次或1次,(x = 0 || x = 1)
const reg = /ba?/;console.log(reg.exec('ba')); //['ba']console.log(reg.exec('baaa')); //['ba']console.log(reg.exec('b')); //['b']复制代码
注:这里只是指明了?字符的限定符方面的用法,它还可以控制贪婪模式和非贪婪模式(下文可见)
{n}: 匹配前一个字符n次,(x = n)
const reg = /ba{3}/;console.log(reg.test('ba')); //falseconsole.log(reg.test('baaa')); //trueconsole.log(reg.test('b')); //false复制代码
{n,}:匹配前一个字符n次或大于n次,(x >=n)
const reg = /ba{3,}/;console.log(reg.test('ba')); //falseconsole.log(reg.test('baaa')); //trueconsole.log(reg.test('baaaa')); //trueconsole.log(reg.test('b')); //false复制代码
{n, m}:匹配前一个字符n次到m次之间,(n <= x <= m)
const reg = /ba{2,3}/;console.log(reg.test('ba')); //falseconsole.log(reg.test('baaa')); //trueconsole.log(reg.test('baa')); //trueconsole.log(reg.test('b')); //false复制代码
元字符(.、\d、\w、\s、\b)
.:匹配除换行符以外的所有字符
const reg = /b.?/;console.log(reg.exec('ba')); //['ba']console.log(reg.exec('bxaa')); //['bx']console.log(reg.exec('bza')); //['bz']console.log(reg.exec('b')); //['b']复制代码
\d:匹配数字字符,与[0-9]一致(单词记忆法 => 数字【digital】)
const reg = /b\d/;console.log(reg.exec('b1')); //['b1']console.log(reg.exec('b2aa')); //['b2']console.log(reg.exec('bza')); //nullconsole.log(reg.exec('b')); //null复制代码
\w:匹配字母、数字和下划线(单词记忆法 => 单词【word】)
const reg = /b\w/;console.log(reg.exec('b1')); //['b1']console.log(reg.exec('b2aa')); //['b2']console.log(reg.exec('bza')); //['bz']console.log(reg.exec('b')); //null复制代码
\b:匹配一个边界,一个独立单词的开头或结尾(单词记忆法 => 边界【border】)
const str = 'moon is white';console.log(str.match(/\bm/)); //['m']console.log(str.match(/oon\b/)); //['oon']复制代码
\s:匹配空白符(空格、换行符、制表符)(单词记忆法 => 符号【space】)
const str = 'moon is white';console.log(str.match(/is\swhite/)); //['is white']console.log(str.match(/moon\sis/)); // ['moon is']复制代码
反元字符([^x]、\D、\W、\B、\S)
[^x]:匹配除x之外的任意字符
const reg = /b[^a]/;console.log(reg.exec('ba')); //nullconsole.log(reg.exec('bz')); //['bz']console.log(reg.exec('by')); //['by']复制代码
\D:匹配除数字之外的任意字符,与\d相反
const reg = /b\D/;console.log(reg.exec('b1')); //nullconsole.log(reg.exec('b2')); //nullconsole.log(reg.exec('by')); //['by']复制代码
\W:匹配除数字、字母和下划线以外的任意字符,与\w相反
const reg = /b\W/;console.log(reg.exec('b1')); //nullconsole.log(reg.exec('ba')); //nullconsole.log(reg.exec('b_')); //nullconsole.log(reg.exec('b*')); //['b*']复制代码
\B:匹配非单词边界的字符,与\b相反
const str = 'moon is white';console.log(str.match(/\Boon/)); //['oon']console.log(str.match(/whit\B/)); //['whit']复制代码
\S:匹配非空白字符,与\s相反
const str = 'moon is white';console.log(str.match(/mo\Sn/)); //['moon']console.log(str.match(/whit\S/)); //['white']复制代码
字符组([...])
[...]:匹配方括号中的字符集合,例如[0-9] => 匹配数字字符
const reg = /b[a-z]/;console.log(reg.test('ba')); //true console.log(reg.test('bA')); //false复制代码
分组((...))
(X):将括号中的字符看成一个组进行匹配,例如(ab)+ => 可以匹配'ababab'
const reg = /(abab)+/;console.log(reg.exec('ababab')); //['abab', 'abab']console.log(reg.exec('abababab')); //['abababab','abab']复制代码
(?:X):匹配X,但是不记录匹配项。而上面的(X)是记录匹配项的。
(?=X):正向肯定查找,即匹配后面紧跟X的字符串。
const reg = /\d+(?=\.)/;console.log(reg.exec('3.141')) //['3']复制代码
(?!X):正向否定查找,即匹配后面不跟X的字符串,与(?:X)相反。
const reg = /\d+(?!\.)/;console.log(reg.exec('3.141')) //['141']复制代码
多选符 (|)
|:匹配两者中的一个,例如a|b => 匹配a或b
const reg = /a|b/;console.log(reg.exec('a')); //['a']console.log(reg.exec('b')); //['b']console.log(reg.exec('c')); //['c']复制代码
转移字符(\)
\:表示转义字符,将特殊的字符转义成普通字符进行匹配
匹配方式
匹配方式,即正则表达式在匹配过程中,当具备多个结果时,按照一定的模式进行匹配。
匹配方式可分为两种,贪婪模式和非贪婪模式。
贪婪模式:即以限定符最大重复标准进行匹配。例如:使用/ba*/匹配'baaaaa'时,结果可返回'baaaaa'
非贪婪模式:即以限定符最小重复标准进行匹配。例如:使用/ba*?/匹配'baaaaa'时,结果可返回'b'
const str = 'baaaaa';console.log(str.match(/ba*/)); //['baaaaa']
console.log(str.match(/ba*?/)); //['b']复制代码
其中?符号起到了贪婪与非贪婪模式之间的转变,在重复限定符后加上?,按非贪婪模式进行匹配;默认为贪婪模式。
标识方式
标识方式,就是正则表达式后面跟的匹配方式,flag
g:全局匹配,记忆方式【global】
i:忽略大小写,记忆方式【ignore】
m:多行搜索,记忆方式【multline】
方法
使用正则表达式的方式一共有6种,可以分成:reg有两种,string有四种。
首先,我们来看一下reg对象带的两种方法:exec和test
test => 判断字符串中是否存在与正则表达式匹配的字符串,返回boolean类型
测试用例:
const reg = /abc/;console.log(reg.test('abca')); //trueconsole.log(reg.test('abac')); //false复制代码
exec => 匹配字符串中满足条件的字符串,返回一个匹配的结果数组
const reg = /\d+/;console.log(reg.exec('1234dhi343sf2')); //['1234']复制代码
之后是string的四种方法:match、search、replace、split
match:查找字符串中的匹配的字符串,返回一个结果数组,若没有匹配则返回null
const str = 'this is reg expression test'console.log(str.match(/\bi.\s\w+/)); //['is reg']复制代码
search:查找字符串中匹配的字符串,返回匹配字符串的下标,若没有匹配则返回-1
const str = 'this is reg expression test'console.log(str.search(/\bi.\s\w+/)); //5复制代码
replace:查找字符串中匹配的字符串,对其进行替换(这是一个个人觉得比较厉害的技能)
- 接收字符串
var str = 'this is reg expression test'console.log(str.replace(/\b(i.)\s(\w+)/, '$1 hello $2')); //'this is hello reg expression test'复制代码
- 接收函数
var str = 'this is reg expression test'str.replace(/\b(i.)\s(\w+)/, (...args) => {console.log(args); }); //["is reg", "is", "reg", 5, "this is reg expression test"]复制代码
注:这个函数会有一些参数,第一个是匹配的字符串,第二个是第一项匹配的,第三个是第二项匹配的,第四个是匹配的下标,第五个是原字符串
split:使用正则表达式或者固定字符,分割字符串
var str = 'this is reg expression test'console.log(str.split(/\s/)) //["this", "is", "reg", "expression", "test"]复制代码
总结
js部分的正则表达式很多东西都以及讲完了,剩下的就是练习了。这种记忆性的东西,需要不断的使用,才会孰能生巧。下面提供一下练习的语句,题目和答案在js正则表达式练习整理
如果你对我写的有疑问,可以评论,如我写的有错误,欢迎指正。你喜欢我的博客,请给我关注Star~呦。大家一起总结一起进步。欢迎关注我的github博客
正则表达式详解 js相关推荐
- JS正则表达式详解2
JS的正则表达式详解 //校验是否全由数字组成 代码 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) retu ...
- python中正则表达式_Python中正则表达式详解
正则表达式是用来简洁表达一组字符串的表达式,本文主要和大家分享Python 中正则表达式知识详解,希望能帮助到大家.操作符说明实例.表示任何单个字符 [ ]字符集,单个字符取值范围[abc]表示a或b ...
- java判断颜色合法_判断颜色是否合法的正则表达式(详解)
判断颜色是否合法的正则表达式(详解) "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$"; 意思是:以#开头,后面是数字和a-f的字符(大写或小写),这个值是 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解
Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...
- 菜鸟教程python正则表达式_python 正则表达式详解
python 正则表达式详解 1. 正则表达式模式 模式描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字 ...
- python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法
我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助. 1.如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了 ...
- linux下grep文件内容搜索工具及基本正则表达式详解
linux下grep文件内容搜索工具及基本正则表达式详解 grep命令: 根据模式(文本字符和基本正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:grep [选 ...
- socket服务器断开消息,详解JS WebSocket断开原因和心跳机制
1.断开原因 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来. ws.onclose = function (e) { console.log('websocket ...
最新文章
- sqlserver2000换成mysql_将Microsoft SQL Server 2000数据库转换成MySQL数据库
- VS2010中文注释带红色下划线的解决方法
- IIS没有.net版本选择标签问题
- c++ doxygen 注释规范_[代码规范]Go语言编码规范指导
- 软件架构:模块、组件、微服务总结
- oFono安装和启动
- python从入门到精通-python从入门到精通视频(大全60集)
- 一款基于jQuery可放大预览的图片滑块插件
- 矢量绘图设计工具:Sketch 79 for mac
- Java版SLG游戏《竜退治2》
- IT加速营-关于java开发,测试及职业规划的公众号
- 一款小工具DeskPinsEx开发笔记
- 本地搭建mysql数据库
- 视频播放控制:防盗链设置与视频加密及Android中的基础应用
- outlook查看html,怎样察看IE/Outlook中HTML页面的源文件
- 如何保持福禄克CFP2-100-Q、OFP2-100-Q等光纤测试仪器的洁净?
- Fingerprint has already been taken
- 计算机id和密码怎么查,忘记Apple ID账号和密码怎么办?
- java jlabel 字体加粗_这样在java里面的标签Jlabel设置字体加粗和下划线
- 第七章集合与字典作业
热门文章
- sqoop 连接超时
- AIOPS2022_题目
- 百度腾讯阿里,其大数据优劣势与策略分析
- [IllegalArgumentException] 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
- eclipse给mysql修改表数据_Eclipse中java向数据库中添加数据,更新数据,删除数据...
- 编程刷题平台Codewars初体验-Java
- Win11如何开启远程桌面连接?
- 面向对象葵花宝典阅读思维导图(一)
- java 定时清理 逻辑删除 数据
- CSS实例 简单案例