JS之RegExp的使用
RegExp的使用
- 基本语法
- 字面量创建
- RegExp构造函数
- RegExp实例属性
- RegExp示例方法
- exec()
- test()
- toLocaleString()和toString()
- *RegExp构造函数的属性
基本语法
ECMAScript通过RegExp类型支持正则表达式,正则表达式使用类似Perl的简洁语法来创建。关于正则表达式的简单介绍可以参考博主的另一篇文章:正则表达式。
字面量创建
语法如下:
let expression = /pattern/flags;
pattern代表模式,模式可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向作用。每个正则表达式可以带零个或者多个的flags(标记),用于控制正则表达式的行为,常见的标记值有:
flags | 含义 |
---|---|
g | 全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束 |
i | 不区分大小写,表示在查找匹配的时候忽略pattern和字符串的大小写 |
m | 多行模式,表示查找到一行文本末尾时会继续查找 |
y | 粘附模式,表示只查找从lastInex开始及之后的字符串 |
u | Unicode模式,启用Unicode匹配 |
s | dotAll模式,表示元字符.匹配任何字符,包括"\n"和"\r" |
使用不同模式和标记可以创建出不同的正则表达式,比如:
let pattern1 = /abc/g; //匹配字符串中所有的abclet pattern2 = /abc/i; //匹配字符串中第一个出现的abclet pattern3 = /abc/gi; //匹配字符串中所有的abc,并且忽略大小写
正则表达式中还会涉及到元字符的概念,元字符常见的有:{ 、} 、( 、) 、[ 、] 、\ 、^ 、$ 、| 、? 、* 、+ 、.(点)。元字符在正则表达式中都有着特殊的功能,要匹配元字符本身的话,就需要用到转义字符:“\”,例如:
let pattern1 = /[ab]d/g; //匹配所有ad或bdlet pattern2 = /\[ab\]d/g; //匹配所有的[ab]d
RegExp构造函数
除了上文的字面量创建正则表达式,RegExp构造函数也可以用于创建正则表达式,它的一般形式为:
let pattern1 = new RegExp("abc", "g");//与let pattern1 = /abc/g;等价
这里还需要注意的是,RegExp构造函数的两个参数都是字符串,因此在某些情况下需要进行二次转义,例如:
let pattern1 = /\[ab\]c/g;let pattern2 = new RegExp("\\[ab\\]c","g");
这里的pattern1和pattern2是等价的,其实也可以简单地理解为如果想要用RegExp构造函数表示的话,转义符号的数量是字面量的两倍。
使用RegExp构造函数还可以基于原有的正则表达式,选择性地修改它们的标记,例如:
let pattern1 = /abc/g;console.log(pattern1); //输出/abc/glet pattern2 = new RegExp(pattern1); console.log(pattern2); //输出/abc/glet pattern3 = new RegExp(pattern1, "i");console.log(pattern3); //输出/abc/i
RegExp实例属性
RegExp实例常见的属性有:
属性 | 代表 |
---|---|
global | 布尔值,表示是否设置了g标记 |
ignoreCase | 布尔值,表示是否设置i标记 |
unicode | 布尔值,表示是否设置了u标记 |
sticky | 布尔值,表示是否设置了y标记 |
mutiline | 布尔值,表示是否设置了m标记 |
dotAll | 布尔值,表示是否设置了s标记 |
source | 正则表达式的字面量字符串(这里与字面量的区别就是没有开头和结尾的斜杠) |
flags | 正则表达式的标记字符串 |
RegExp示例方法
exec()
RegExp示例的主要方法是exec(),主要用于配合捕获组,(可以理解为一个括号就是一个捕获组),exec方法只接收一个参数,就是要应用模式的字符串,如果找到了匹配项,就会返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。这里要注意的是,返回的数组虽然是Array的实例,但包含两个额外的属性:index和input,index是字符串中匹配模式的起始位置,input是要查找的字符串。返回数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只有一个元素,具体例子如下:
let str = 'abcabce';let pattern = /(.)b(.)/g;let result = pattern.exec(str);console.log(result);console.log(result.input);console.log(result.index);console.log(result[0]);console.log(result[1]);console.log(result[2]);
结果如下:
如果模式设置了全局模式,则每次调用exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次exec(),也只会返回第一个匹配的信息,如:
let str = 'cat, bat, sat, fat';let pattern = /.at/;let result = pattern.exec(str);console.log(result.index); //0console.log(result[0]); //catconsole.log(pattern.lastIndex); //0result = pattern.exec(str);console.log(result.index); //0console.log(result[0]); //cat console.log(pattern.lastIndex); //0
而如果当我们设置了全局标记:
let str = 'cat, bat, sat, fat';let pattern = /.at/g;let result = pattern.exec(str);console.log(result.index); //0console.log(result[0]); //catconsole.log(pattern.lastIndex); //3result = pattern.exec(str);console.log(result.index); //5console.log(result[0]); //batconsole.log(pattern.lastIndex); //8
而当模式设置了粘附标记y,则每次调用exec()都只会在lastIndex的位置上寻找匹配项。粘附标记会覆盖全局标记。具体例子如下:
let str = 'cat, bat, sat, fat';let pattern = /.at/y;let result = pattern.exec(str);console.log(result.index); //0console.log(result[0]); //catconsole.log(pattern.lastIndex); //3result = pattern.exec(str);//以索引3对应的字符开头找不到匹配项,exec()返回nullconsole.log(result); //null//exec()没有找到匹配项,于是lastIndex设置为0console.log(pattern.lastIndex); //0//如果将lastIndex设置为5,让exec()可以找到下一个匹配项pattern.lastIndex = 5;result = pattern.exec(str);console.log(result.index); //5console.log(result[0]); //catconsole.log(pattern.lastIndex); //8
test()
test()用于测试特定的数值序列。如果输入的文本与模式匹配,则显示匹配成功的消息,一般用于验证用户的输入:
let str = '123-123-12';let pattern = /\d{3}-\d{3}-\d{2}/g;let result = pattern.test(str);if(result){console.log('符合格式'); //输出符合格式}else{console.log('不符合格式');}
toLocaleString()和toString()
这两个方法都是用于获得正则表达式字面量的形式,无论正则表达式是字面量创建的还是RegExp构造函数创建的:
let pattern1 = new RegExp("abc", "g");let pattern2 = /abc/g;console.log(pattern1.toLocaleString()); //输出/abc/gconsole.log(pattern1.toString()); //输出/abc/gconsole.log(pattern2.toLocaleString()); //输出/abc/gconsole.log(pattern2.toString()); //输出/abc/g
*RegExp构造函数的属性
RegExp构造函数本身也有几个属性,这些属性适用于作用域中的所有正则表达式,而且会根据最后执行的正则表达式操作而变化,这些属性都有全名和简写,具体如下:
全名 | 简写 | 说明 |
---|---|---|
input | $_ | 最后搜索的字符串 |
lastMatch | $& | 最后匹配的文本 |
lastParen | $+ | 最后匹配的捕获组 |
leftContext | $` | input字符串中出现在lasMatch前的文本 |
rightContext | $’ | input字符串中出现在lasMatch后的文本 |
具体使用如下:
let text = "this is a sentence";let pattern = new RegExp("(.)s","g");if(pattern.test(text)){console.log(RegExp.input);console.log(RegExp.leftContext);console.log(RegExp.rightContext);console.log(RegExp.lastMatch);console.log(RegExp.lastParen);}
结果:
也可以使用简写:
let text = "this is a sentence";let pattern = new RegExp("(.)s","g");if(pattern.test(text)){console.log(RegExp["$_"]);console.log(RegExp["$`"]);console.log(RegExp["$'"]);console.log(RegExp["$&"]);console.log(RegExp["$+"]);}
RegExp构造函数还有几个属性,可以存储最多9个捕获组的匹配项,通过RegExp.$1~RegExp.$9来访问。
RegExp构造函数的所有属性都没有任何Web标准出处,因此不要在生产环境中使用它们。
JS之RegExp的使用相关推荐
- Js中RegExp对象
Js中RegExp对象 RegExp对象表示正则表达式,是由普通字符和特殊字符也叫元字符或限定符组成的文字模板,用于对字符串执行模式匹配. 描述 创建一个RegExp对象通常有两种方式,一种是通过字面 ...
- php 全局匹配,JS使用RegExp对象实现replaceall全局匹配并替换
javascript中替换字符串的方法是replace函数,但在网站开发的过程中使用时却发现该函数只会替换第一个被匹配的字符,而不能像PHP的replace一样实现全局匹配并替换. 例: var st ...
- JS C26 RegExp
RegExp 1.定义 var reg = /abc/i; var str = 'abcd' console.log(reg.test(str)); true; var reg = /ab/g; va ...
- JS replace()方法替换变量(可以对变量进行全文替换)
JS replace()方法替换变量(可以对变量进行全文替换) JS 替换一个多行文本的关键字 正常,没有变量的时候应该是这样: 把 a 替换成 b: string.replace("a&q ...
- JS正则表达式完全匹配字符
js中 RegExp 对象使用 test() 来匹配正则表达式时,只要有子字符串能够匹配成功就会返回 true. 如果要当正则表达式完全匹配整个字符串时 test() 才返回true的话,可以在正则表 ...
- Java魔法堂:深入正则表达式API
目录 一.前言 二.正则表达式的使用诉求 三.java.util.regex包 四.java.lang.String实例 五.最短路径实现诉求 六.Java支持的正则表达式功能语法 七.总结 八.参考 ...
- 60分钟正则从入门到深入
本文转载自网络.转载编辑过程中,可能有遗漏或错误,请以原文为准. 原文作者:水墨寒湘 原文链接:https://juejin.im/post/582dfc... 正则表达式对于我来说一直像黑暗魔法一样 ...
- 【正则表达式系列】一些概念(字符组、捕获组、非捕获组)
前言 本文介绍一些正则中的常用名词以及对应概念,譬如字符组,捕获组.非捕获组.反向引用.转义和\s \b等 大纲 字符组 捕获组 反向引用 非捕获组 ..\s和\S \b \转义 字符组 []字符组表 ...
- javascript 之数据类型--01
写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...
- 前端之模拟数据 - HackerVirus - 博客园
阅读目录 玩转前端之模拟数据 回到目录 玩转前端之模拟数据 博客园主页:http://www.cnblogs.com/handoing/ 是否还在为前端模拟数据头疼? 是否还在为后端返回数据格式较多内 ...
最新文章
- python退出函数_python 退出程序的方式
- 复数混频发射机原理与仿真
- string的find函数
- 2010年浙江大学计算机及软件工程研究生机试真题
- 华为FusionCube从融合到超融合 只为让计算变简单
- 光驱安装centos7系统过程_centos7可以ping通外网_可以ping通内网其他机器_但是其他机器就是ping不通centos7_太神奇了---linux工作笔记041
- 【转载】深入浅出VA函数
- 一款桌面整理软件——Fences
- IDEA 2017 破解 license 激活
- 计算机硬件具体都包含哪些,电脑硬件包括哪些
- 论文翻译 | TOOD:《TOOD: Task-aligned One-stage Object Detection》详细解读
- BZOJ3161 : 孤舟蓑笠翁
- a8处理器相当于骁龙几_iPhone 8P相当于什么水平的安卓机?发现两点劣势,其它无关紧要...
- 第四届高教杯计算机绘图教程,第三届“高教杯”机械类计算机绘图试卷(三维).pdf...
- JVM_06 内存模型(JMM)篇
- ArcGIS10.5安装时提示localhost没有有效管理许可怎么办
- Xilinx-7系列FPGA架构—— CLB
- Linux知识入门(一)
- 关于微软学术搜索项目
- 某个偏锥面跟平面的交线