关于JS中正则表达式

2019-11-01 admin

前言

对于前端开发来说,正则表达式是我们避不开的且需要重点掌握的技能,作为一门用途很广,但是又常常让人望而生畏的技术。花时间去深入理解并且融合贯通是值得。

基本概念

什么是正则表达式?正则表达式是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来匹配文本。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。

声明方式

新建正则表达式有两种方法并且以斜杠表示开始和结束。

1、字面量声明

var regex = /xyz/;

2、构造函数声明

var regex = new RegExp('xyz');

3、ES6构造函数声明

ES6RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。ES5不支持这种方式。

var regex = new RegExp(/xyz/ig, 'i');
regex.flags // 'i'

上面代码中,原有正则对象的修饰符是ig,它会被第二个参数i覆盖。

正则表达式语法

实例方法

1、test()

正则实例对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。

/cat/.test('cats and dogs') // true

2、exec()

正则实例对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null

var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

r1.exec(s) // ["x"]
r2.exec(s) // null

修饰符

修饰符表示模式的附加规则,放在正则模式的最尾部。修饰符可以单个使用,也可以多个一起使用。

1、ES5中修饰符

  • gglobal 执行一个全局匹配,匹配所有结果。加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。

默认情况下,第一次匹配成功后,正则对象就停止向下匹配了

var regex = /b/g;
var str = 'abba';

regex.test(str); // true
regex.test(str); // true
regex.test(str); // false
  • iignorecase执行一个不区分大小写的匹配。
/abc/.test('ABC') // false
/abc/i.test('ABC') // true
/world$/.test('hello world\n') // false
/world$/m.test('hello world\n') // true

2、ES6中新增修饰符

ES6 对正则表达式添加了u修饰符,含义为“Unicode模式”,用来正确处理大于uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。

/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true

ES6 还为正则表达式添加了y修饰符,叫做“粘连”(sticky)修饰符。

y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]

r1.exec(s) // ["aa"]
r2.exec(s) // null

基本要素

字符类

1、点字符(.)

匹配除回车、换行、行分隔符和段分隔符以外任意一个字符

/c.t/

2、[ ]

匹配括号中的任意一个字符

/[abc]/.test('hello world') // false
/[abc]/.test('apple') // true

3、连字符(-)

[ ]内表示字符范围

/a-z/.test('b') // false 
/[a-z]/.test('b') // true

4、脱字符(^)

如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。

/[^abc]/.test('bbc news') // true
/[^abc]/.test('bbc') // false

数量限定符

1、问号表示某个模式出现0次或1次,等同于{0, 1}

// t 出现0次或1次
/t?est/.test('test') // true
/t?est/.test('est') // true

2、+加号表示某个模式出现1次或多次,等同于{1,}

// t 出现1次或多次
/t+est/.test('test') // true
/t+est/.test('ttest') // true
/t+est/.test('est') // false

3、*星号表示某个模式出现0次或多次,等同于{0,}

// t 出现0次或多次
/t*est/.test('test') // true
/t*est/.test('ttest') // true
/t*est/.test('tttest') // true
/t*est/.test('est') // true

4、{n}表示恰好重复n次。

/lo{2}k/.test('look') // true

5、{n,}表示至少重复n次。

/lo{2,}k/.test('looook') // true

6、{n,m}表示重复不少于n次,不多于m次。

/lo{2,5}k/.test('looook') // true

位置限定符

1、^ 表示字符串的开始位置

// test必须出现在开始位置
/^test/.test('test123') // true

2、`<div class=“article fmt article__content” data-id=“1190000020883704” data-license=""表示字符串的结束位置

// test必须出现在结束位置
/test$/.test('new test') // true

特殊字符

1、转义符(\)

/1+1/.test('1+1')
// false

/1\+1/.test('1+1')
// true

2、()将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符

([0-9]{1,3}\.){3}[0-9]{1-3} //匹配ip地址

3、选择符(|)

竖线符号(|)在正则表达式中表示“或关系”。

/11|22/.test('911') // true

预定义模式

预定义模式指的是某些常见模式的简写方式。

  • \d 匹配0-9之间的任一数字,相当于[0-9]
  • \D 匹配所有0-9以外的字符,相当于[^0-9]
  • \w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
  • \W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]
  • \s 匹配空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]
  • \S 匹配非空格的字符,相当于[^ \t\r\n\v\f]
  • \b 匹配词的边界。
  • \B 匹配非词边界,即在词的内部。

进阶使用

字符串正则方法

字符串对象共有 4 个方法,可以使用正则表达式:match()replace()search()split()

1、match()

字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果。

var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

s.match(r1) // ["x"]
s.match(r2) // null

2、replace()

字符串对象的replace方法可以替换匹配的值。它接受两个参数,第一个是正则表达式,表示搜索模式,第二个是替换的内容。

正则表达式如果不加g修饰符,就替换第一个匹配成功的值, 否则替换所有匹配成功的值。

'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/a/, 'b') // "baa"
'aaa'.replace(/a/g, 'b') // "bbb"

3、search()

字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1

'_x_x'.search(/x/)
// 1

4、split()

字符串对象的split方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。

该方法接受两个参数,第一个参数是正则表达式,表示分隔规则,第二个参数是返回数组的最大成员数。

// 非正则分隔
'a,  b,c, d'.split(',')
// [ 'a', '  b', 'c', ' d' ]

// 正则分隔,去除多余的空格
'a,  b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]

// 指定返回数组的最大成员
'a,  b,c, d'.split(/, */, 2)
[ 'a', 'b' ]

贪婪模式

?、*、+匹配符默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止。这被称为贪婪模式。

var s = 'aaa';
s.match(/a+/) // ["aaa"]

非贪婪模式

  • +?:表示某个模式出现1次或多次,匹配时采用非贪婪模式。
  • *?:表示某个模式出现0次或多次,匹配时采用非贪婪模式。
  • ??:表格某个模式出现0次或1次,匹配时采用非贪婪模式。
'abb'.match(/ab*b/) // ["abb"]
'abb'.match(/ab*?b/) // ["ab"]

'abb'.match(/ab?b/) // ["abb"]
'abb'.match(/ab??b/) // ["ab"]

组匹配

正则表达式的括号表示分组匹配,括号中的模式可以用来匹配分组的内容。

/fred+/.test('fredd') // true
/(fred)+/.test('fredfred') // true

1、分组捕获

var m = 'abcabc'.match(/(.)b(.)/);
m
// ['abc', 'a', 'c']

// 全局
var m = 'abcabc'.match(/(.)b(.)/g);
m // ['abc', 'abc']

2、非捕获组

(?:x)称为非捕获组,表示不返回该组匹配的内容,即匹配的结果中不计入这个括号。

var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]

3、先行断言

x(?=y)称为先行断言,x只有在y前面才匹配,y不会被计入返回结果。

var m = 'abc'.match(/b(?=c)/);
m // ["b"]

4、先行否定断言

x(?!y)称为先行否定断言,x只有不在y前面才匹配,y不会被计入返回结果。

/\d+(?!\.)/.exec('3.14')
// ["14"]

总结

正则表达式是开发中经常需要使用的技术,也是前端必须掌握的技能,它的重要性不言而喻。不熟练的童鞋加紧学习。

[转载]原文链接:https://segmentfault.com/a/1190000020883704

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-78764.html

文章标题:关于JS中正则表达式

相关文章
Node.js 2014这一年发生了什么
Node.js 的 2014 年充满了不幸和争议. 这一年 Noder 们经历了太多的伤心事, 经历了漫长的等待, 经历了沉重的分裂之痛. 也许 Noder 们不想回忆14年 Node.js land 发生的事情, 但正因为痛才更有铭记的价...
2015-11-12
jsdom 中文文档(纯翻译)
jsdom是一个纯粹由 javascript 实现的一系列 web标准,特别是 WHATWG 组织制定的DOM和 HTML 标准,用于在 nodejs 中使用。大体上来说,该项目的目标是模拟足够的Web浏览器子集,以便用于测试和挖掘真实世界...
2018-05-14
Vue.js组件tab实现选项卡切换
本文实例为大家分享了vue插件tab选项卡的具体代码,供大家参考,具体内容如下 效果图: 代码如下: &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; ...
2017-03-13
React.js编程思想
JavaScript框架层出不穷,在很多程序员看来,React.js是创建大型、快速的Web应用的最好方式。这一款由Facebook出品的JS框架,无论是在Facebook还是在Instagram中,它的表现都非常出色。 使用React.j...
2015-11-12
从2014年的发展来展望JS的未来将会如何
&lt;font face=&quot;寰�杞�闆呴粦, Arial, sans-serif &quot;&gt;2014骞达紝杞�浠惰�屼笟鍙戝睍杩呴€燂紝鍚勭�嶈��瑷€灞傚嚭涓嶇┓锛屼互婊¤冻鐢ㄦ埛涓嶆柇鍙樺寲鐨勯渶姹傘€傝繖浜涜��...
2015-11-12
three.js实现围绕某物体旋转
话不多说,请看代码: 可以拖动右上角观察变化 &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot; style=&quot;width: 100%; height:100%;&quot;&gt...
2017-02-17
JS中的语音合成——Speech Synthesis API
JS中的语音合成——Speech Synthesis API 简介 HTML5中和Web Speech相关的API实际上有两类,一类是“语音识别(Speech Recognition)”,另外一个就是“语音合成(Speech Synthes...
2018-05-17
JavaScript教程:JS中的原型
Keith Peters 几年前发表的一篇博文,关于学习没有“new”的世界,其中解释了使用原型继承代替构造函数。两者都是纯粹的原型编码。 标准方法(The Standard Way) 一直以来,我们学习的在 JavaScript 里创建对...
2015-11-12
NodeJS参考手册pdf版
下载地址:Nodejs参考手册PDF版下载 ...
2015-11-12
Node.js学习(1)----HTTP服务器与客户端
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 Jav...
2015-11-12
回到顶部