JS: RegExp(正则表达式)
RegExp (包含ES2018新特性)
注意:本次所有代码都仅在Chrome 70中进行测试
正则表达式是什么?
正则表达式是用于匹配字符串中字符组合的模式。(mdn)
简单来说,正则表达式是用来提取、捕获文本的。
创建:
字面量:
let regex = / pattern / flagslet regex1 = /foo/i;
构造函数:
let regex = new RegExp(pattern, falgs);let regex2 = new RegExp('bar', ig); // ES5
let regex3 = new RegExp(/bat/im); // ES5
let regex4 = new RegExp(/cat/ig, 'g'); // ES6
/* regex4 创建方法在ES5中会抛出TypeError,因为第一个参数已经是一个正则表达式,而ES5不允许此时再使用第二个参数添加修饰符。ES6则允许这种写法,但第二个参数会作为修饰符覆盖第一个参数中的修饰符。*/
console.log(regex4); // /cat/g
实例属性:
每个正则表达式实例都拥有下面的属性,以便获取实例模式的信息。
global:布尔值,表示是否设置了 g(全局匹配)标志。
ignoreCase:布尔值,表示是否设置了 i(忽略大小写)标志。
multiline:布尔值,表示是否设置了 m(多行)标志。
unicode:布尔值,表示是否设置了 u(识别 unicode 字符中大于
\uFFFF的 unicode 字符)标志。sticky:布尔值,表示是否设置了 y(粘连)标志。
lastIndex:上次成功匹配后的索引位置,会成为下次匹配的开始索引位置,只在全局匹配或粘滞匹配模式下可用。
source:正则表达式中
pattern(模式)的字符串表示,与调用toString()或者valueOf()方法得到的结果并不一样。flags:返回正则表达式中
flags(修饰符)的字符串表示。dotAll:返回一个布尔值,表示是否设置了 s(dotAll)标志。
let str2 = 'batfoocat';
let pattern2 = /at/g; pattern2.global; // true
pattern2.sticky; // false
pattern2.source; // at
pattern2.flags; // g
pattern2.toString(); // /at/g
pattern2.valueOf(); // /at/g
pattern2.lastIndex; // 0 let matches = pattern2.exec(str2); // 第一次
matches[0]; // at
matches.index; // 1
pattern2.lastIndex; // 3 matches = pattern2.exec(str2); // 第二次
matches[0]; // at
matches.index; // 7
pattern2.lastIndex; // 9 /*第三次会出现报错,是因为已经没有匹配项了,exec()方法返回了null,再执行第四次就会返回第一次匹配的结果,即重新开始匹配*/
matches = pattern2.exec(str2); // 第三次
matches[0]; // error
matches.index); // error
pattern2.lastIndex; // 0
补充:已经废弃的属性(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features)
这些废弃的特性仍然可以使用,但你要保持谨慎,因为它们很可能会在未来的某个时候被删除.(mdn)
方法:
exec:在指定字符串中进行匹配字符,每次只会返回一个匹配项的信息。匹配成功,则返回一个数组,并更新正则表达式实例的属性,否则返回 null。
返回的数组是 Arrary 实例,但包含了两个属性:index(匹配项在字符串中的位置)和 input(正则表达式进行匹配的字符串),数组第一项(下标0)存放匹配到的文本。
注意:如果使用了全局匹配(g),再次使用
exec()方法会返回第二个匹配项的信息,否则无论使用多少次exec()方法都只会返回第一个匹配项信息。补充:ES2018在返回数组中新增了一个属性
groups(命名捕获组的信息)let str1 = 'batfoocat';
let pattern1 = /at/g;
pattern1.exec(str1); // 第一次
// ["at", index: 1, input: "batfoocat", groups: undefined]
pattern1.exec(str1); // 第二次
// ["at", index: 7, input: "batfoocat", groups: undefined]
pattern1.exec(str1); // 第三次
// null
// 第四次会重新开始匹配,即返回第一次匹配的结果
test():测试当前正则表达式是否能匹配目标字符串,返回布尔值。let str3 = 'batfoocat';
let str4 = 'abcde';
let pattern3 = /at/g;
pattern3.test(str3); // true
pattern3.test(str4); // false
String.prototype.search():检索与正则表达式相匹配的子字符串,匹配成功返回第一个匹配项在字符串中的下标,否则返回-1。let str5 = 'abcdea';
str5.search(/a/g); // 0
str5.search(/f/g); // -1
String.prototype.match():检索与正则表达式相匹配的子字符串,匹配成功返回一个存放所有匹配项的数组,否则返回null,如果正则表达式中没有标志 g(全局标志),那么match()方法就只能执行一次匹配。注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果需要这些全局检索的信息,可以使用
RegExp.exec()。let str6 = 'abcdea';
str6.match(/a/g);
// ["a", "a"]
str6.match(/a/);
// ["a", index: 0, input: "abcdea", groups: undefined]
str6.match(/f/g);
// null
String.prototype.replace(regexp, replacement):替换一个与正则表达式匹配的子串。let str7 = 'batfoocat';
let a = str7.replace(/at/g, 'oo');
// "boofoocoo" let b = str7.replace(/at/, 'oo');
// "boofoocat" let c = str7.replace(/at/g, (value)=> {
return '!' + value;
});
// "b!atfooc!at"
String.prototype.split(separator [, howmany]):把一个字符串分割成字符串数组,第二个参数为可选,该参数可指定返回的数组的长度,不填则返回所有。let str8 = 'batfoocat';
let a = str8.split(/at/g); // ["b", "fooc", ""]
let b = str8.split(/at/); // ["b", "fooc", ""]
let c = str8.split(/at/, 2); // ["b", "fooc"]
修饰符(标志 - flags):
g:全局匹配,找到所有匹配,而不是在发现第一个匹配项后立即停止。
let str9 = 'batfoocat';
str9.match(/at/);
// ["at", index: 1, input: "batfoocat", groups: undefined]
str9.match(/at/g);
// ["at", "at"]
i:忽略大小写。
let str10 = 'AabbccDD';
str10.match(/a/gi); // ["A", "a"]
str10.match(/a/g); // ["a"]
str10.match(/A/g); // ["A"]
m:执行多行匹配,和
^和$搭配起来使用。多行; 将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。(mdn)
`
abc
def
`.match(/def/);
// ["def", index: 5, input: "↵abc↵def↵", groups: undefined] `
abc
def
`.match(/def/m);
// ["def", index: 5, input: "↵abc↵def↵", groups: undefined] `
abc
def
`.match(/^def$/);
// null `
abc
def
`.match(/^defc$/m);
// ["def", index: 5, input: "↵abc↵def↵", groups: undefined]
u:Unicode 模式,可以正确处理码点大于
\uFFFF的 Unicode 字符。/\u{20BB7}/.test('JS: RegExp(正则表达式)的更多相关文章
- js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression)
js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression) 一.总结 1.str_replace:正则作用:高效快速匹配 2.break ...
- js进阶正则表达式13RegExp对象方法(RegExp对象的方法:compile,test,exec)(子表达式 var reg1=/([a-z]+)\d/)
js进阶正则表达式13RegExp对象方法(RegExp对象的方法:compile,test,exec)(子表达式 var reg1=/([a-z]+)\d/) 一.总结 1.RegExp对象有三个方 ...
- js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译)
js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译) 一.总结 1. RegExp的属性和方法,就是RegE ...
- RegExp正则表达式(三)–js中正则表达式的定义
在js中,RegExp正则表达式的定义有两种方式:一种是普通方式,另一种是构造函数方式.无论是那种定义正则表达式的方式,它们都会返回RegExp对象. 普通方式定义正则表达式的格式 语法: var 变 ...
- JS获取url中query_str JavaScript RegExp 正则表达式基础详谈
面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1 1.window.location.href(设置或获取整个 URL ...
- JS RegExp对象(正则表达式)
笔记整理自:廖雪峰老师的JS教程 正则表达式语法:https://www.runoob.com/regexp/regexp-tutorial.html 目录 创建方式 方式一 方式二 简单使用 判断正 ...
- js常用正则表达式2
字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对 ...
- js里正则表达式详解
详细内容请点击 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/ ...
- js之正则表达式(上)
1.正则表达式的创建方式 两种方式创建:通过new修饰符创建和字面量的方式创建 1>new修饰符方式创建 var b2=new RegExp('Box','ig'); //第二个参数是 模式字符 ...
- Js用正则表达式验证字符串
js 常用正则表达式表单验证代码 作者: 字体:[增加 减小] 类型:转载 js 常用正则表达式表单验证代码,以后大家就可以直接使用了. 正则表达式使用详解 简介 简单的说,正则表达式是一种可以用于模 ...
随机推荐
- Perl注释文本的高亮显示规则
sub help{ print <<EndOfUsage;\e[1;37mHELP :1. Usage : perl $0 input output 2. Function : tran ...
- 20155206 2016-2017-2 《Java程序设计》第9周学习总结
20155206 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- 551. Student Attendance Record I
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- 2018.10.12 NOIP训练 01 串(倍增+hash)
传送门 一道挺不错的倍增. 其实就是处理出每个数连向的下一个数. 由于每个点只会出去一条边,所以倍增就可以了. 开始和zxyzxyzxy口胡了一波O(n+m)O(n+m)O(n+m)假算法,后来发现如 ...
- 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...
- 45 The Effect of External Rewards on Behavior 外界奖励对行为的影响
The Effect of External Rewards on Behavior 外界奖励对行为的影响 ①Psychologists take opposing views on how exte ...
- c语言学生信息管理系统-学习结构体
#include<stdio.h> #include<stdlib.h> //结构体可以存放的学生信息最大个数,不可变变量 ; //学生信息结构体数组,最多可以存放100个学生 ...
- MATLAB常用函数
Matlab的内部常数 pi 圆周率 exp(1) 自然对数的底数e i 或j 虚数单位 Inf或 inf ...
- JSP、Servlet中get请求和post请求的区别总结
在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...
- Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源
最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...
- js进阶正则表达式实现过滤字符串(RegExp对象操作正则表达式)(正则:regular)(表达式:expression)