老生常谈JavaScript 正则表达式语法


Posted in Javascript onAugust 20, 2016

JavaScript定义正则表达式有两种方法。

1.RegExp构造函数

var pattern = new RegExp("[bc]at","i");

它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。

2.字面量

var pattern = /[bc]at/i;

正则表达式的匹配模式支持三种标志字符串:

g:global,全局搜索模式,该模式将被应用于所有字符串,而并非搜索到第一个匹配项就停止搜索;

i:ingore case,忽略字母大小写,即在确定匹配项时忽略模式和字符串大小写;

m:multiple lines,多行模式,即在搜索到达一行文本末尾时会继续查找下一行是否有匹配项。

这两种创建正则表达式方法的不同之处在于,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是新实例。

元字符

元字符是拥有特殊意义的字符,正则表达式的元字符主要有:

( [ { \ ^ $ | ) ? * + .

在不同的组合中元字符有其不同的意义。

预定义特殊字符

老生常谈JavaScript 正则表达式语法

字符类

简单类

一般情况下正则表达式一个字符对应字符串一个字符,但我们可以使用[]来构建一个简单的类,来表示符合某一特征的一类字符。例如:

老生常谈JavaScript 正则表达式语法

[abc]可以匹配方括号中的a、b、c或其任意组合的字符。

反向类

既然[]可以构建一个类,那么自然就会联想到与之对应的不包含括号中内容的类,这个类叫做反向类,例如[^abc]就可以匹配不是a或b或c的字符。

老生常谈JavaScript 正则表达式语法

范围类

有时候一个一个字符匹配太麻烦而且匹配的类型也相同,此时我们可以使用"-"连接线来表示某个闭区间之间的内容,例如匹配所有小写字母可以使用[a-z],如下:

老生常谈JavaScript 正则表达式语法

匹配所有的0到9简直的任意数字可以使用[0-9]表示:

老生常谈JavaScript 正则表达式语法

预定义类

对于如上我们创建的几个类,正则表达式为我们提供了几个常用的预定义类来匹配常见的字符,如下:

字符 等价类 含义
. [^\n\r] 匹配除了回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白字符
\S [^\t\n\x0B\f\r] 非空白字符
\w [a-zA-Z_0-9] 单词字符(字母、数字和下划线)
\W [^a-zA-Z_0-9] 非单词字符

量词

上面的方法匹配字符都是一对一匹配的,如果某个字符连续出现多次按照上面的方法匹配会非常麻烦,因此我们想有没有其它方法可以直接匹配多次重复出现的字符。正则表达式为我们提供了一些量词,如下:

字符 含义
? 出现零次或一次(最多一次)
+ 出现一次或多次(至少一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

贪婪模式与非贪婪模式

对于{n,m}这种匹配方式,到底是匹配n个还是匹配m个呢?这就涉及到匹配模式的问题。默认情况下,量词是尽可能多的匹配字符,也就是所谓的贪婪模式,例如:

var num = '123456789'; 
num.match(/\d{2,4}/g); //[1234]、[5678]、[9]

与贪婪模式对于的是非贪婪模式,只需要在量词之后加"?"即可,例如{n,m}?,就是按照最少的字符匹配,如下: 

var num = '123456789'; 
num.match(/\d{2,4}?/g); //[12]、[34]、[56]、[78]、[9]

分组

量词只能是单个字符匹配多次,如果我们希望匹配某一组字符多次呢?正则表达式中小括号可以定义一个字符串整体为一个分组。

我们想要匹配apple这个单词出现4次可以这样匹配(apple){4},如下:

老生常谈JavaScript 正则表达式语法

如果想要匹配apple或orange出现4次,可以插入管道符"|",例如:

(apple|orange){4}

老生常谈JavaScript 正则表达式语法

如果使用分组的正则表达式中出现多个小括号即多个分组,那么匹配结果就会把匹配项也分组并编号,例如:

(apple)\d+(orange)

老生常谈JavaScript 正则表达式语法

如果我们不希望捕获某些分组,只需要在分组的小括号前面紧跟一个问号和冒号即可,例如:

(?:apple)\d+(orange)

老生常谈JavaScript 正则表达式语法

边界

正则表达式也为我们提供了几个常用的边界匹配字符,例如:

字符 含义
^ 以xx开头
$ 以xx结尾
\b 单词边界,指[a-zA-Z_0-9]之外的字符
\B 非单词边界

其中单词边界匹配的是一个位置,这个位置的一侧是构成单词的字符,但另一侧为非单词字符、字符串的开始或结束位置。

前瞻

前瞻用来匹配接下来出现的是或不是某一个特定的字符集。

表达式 含义
exp1(?=exp2) 匹配后面是exp2的exp1
exp1(?!exp2) 匹配后面不是exp2的exp1

看一个例子:

apple(?=orange)

老生常谈JavaScript 正则表达式语法

(/apple(?=orange)/).test('appleorange123'); //true 
(/apple(?=orange)/).test('applepear345'); //false

再看另一个例子:

apple(?!orange)

老生常谈JavaScript 正则表达式语法

(/apple(?!orange)/).test('appleorange123'); //false 
(/apple(?!orange)/).test('applepear345'); //true

以上这篇老生常谈JavaScript 正则表达式语法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的地址栏射击游戏代码
Mar 10 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
Dec 16 Javascript
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
Jun 24 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
Jan 06 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
基于Vue.js实现简单搜索框
Mar 26 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
深入理解ES6学习笔记之块级作用域绑定
Aug 19 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
vant 中van-list的用法说明
Nov 11 Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 #Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 #Javascript
再谈Javascript中的异步以及如何异步
Aug 19 #Javascript
用原生js统计文本行数的简单示例
Aug 19 #Javascript
jQuery购物网页经典制作案例
Aug 19 #Javascript
手机Web APP如何实现分享多平台功能
Aug 19 #Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 #Javascript
You might like
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
深入PHP与浏览器缓存的分析
2013/06/03 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
关于python字符串方法分类详解
2019/08/20 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python 读取.nii格式图像实例
2020/07/01 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
幼师中班个人总结
2015/02/12 职场文书
心灵点滴观后感
2015/06/02 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
MySQL 服务和数据库管理
2021/11/11 MySQL