JS的正则表达式及详解
定义
正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。
javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法;另一种是构造函数写法。
var expression = /pattern/flags;
g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。
i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写。
m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
ECMAScript3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。ECMAScript5规范则做了相反的规定,同一段代码所表示的正则表达式直接量的每次运算都返回新对象。IE6-8一直是按照ECMAScript5规范的方式实现的,所以并没有兼容性问题。
RegExp构造函数
和普通的内置对象一样,RegExp正则表达式对象也支持new+RegExp()构造函数的形式
RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和可选的标志字符串(flags),标志字符串和字面量的三个标志含义相同:‘g’、‘i’、‘m’
RegExp构造函数的两个参数都是字符串。且使用字面量形式定义的任何表达式都可使用构造函数
特点
javascript中的正则表达式最大的特点是不支持空白,必须写在一行中。
//匹配ab
console.log(/ab/.test('ab')); //true
console.log(/ ab/.test('ab')); //false
console.log(/a b/.test('ab')); //false
console.log(/ab /.test('ab')); //false
元字符
大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。
/dog/.test("old dog") // true
但还有一些字符,它们除了字面意思外,还有着特殊的含义,这些字符就是元字符
在javascript中,共有14个元字符(meta-character):
() [] {} \ ^ $ | ? * + .
元字符 名称 匹配对象
. 点号 单个任意字符(除回车\r、换行\n、行分隔符\u2028和段分隔符\u2029外)
[] 字符组 列出的单个任意字符
[^] 排除型字符组 未列出的单个任意字符
? 问号 匹配0次或1次
* 星号 匹配0交或多次
+ 加号 匹配1次或多次
{min,max} 区间量词 匹配至少min次,最多max次
^ 脱字符 行的起始位置
$ 美元符 行的结束位置
| 竖线 分隔两边的任意一个表达式
() 括号 限制多选结构的范围,标注量词作用的元素,为反向引用捕获文本
\1,\2... 反向引用 匹配之前的第一、第二...组括号内的表达式匹配的文本
转义字符
转义字符(escape)表示为反斜线()+字符的形式,共有以下3种情况:
因为元字符有特殊的含义,所以无法直接匹配。如果要匹配它们本身,则需要在它们前面加上反斜杠
''加非元字符,表示一些不能打印的特殊字符
\t 制表符\u0009 \n 换行符\u000A \r 回车符\u000D
''加任意其他字符,默认情况就是匹配此字符,也就是说,反斜线被忽略了
字符组和范围
字符组(Character Class),有的编译成字符类或字符集。简单而言,就是指用方括号表示的一组字符,它匹配若干字符之一,正则表达式通过连字符(-)提供了范围表示法,可以简化字符组:
/[0123456789]/
//等价于
/[0-9]//[abcdefghijklmnopqrstuvwxyz]/
//等价于
/[a-z]/
在字符组中可以同时并列多个’-'范围:
/[0-9a-zA-Z]/;//匹配数字、大写字母和小写字母
/[0-9a-fA-F]/;//匹配数字,大、小写形式的a-f,用来验证十六进制字符console.log(/[0-9a-fA-F]/.test('d'));//true
console.log(/[0-9a-fA-F]/.test('x'));//false
排除
字符组的另一个类型是排除型字符组,在左方括号后紧跟一个脱字符’^'表示,表示在当前位置匹配一个没有列出的字符。
//匹配第一个是数字字符,第二个不是数字字符的字符串
console.log(/[0-9][^0-9]/.test('1e'));//true
console.log(/[0-9][^0-9]/.test('q2'));//false
简记
用[0-9]、[a-z]等字符组,可以很方便地表示数字字符和小写字母字符。对于这类常用字符组,正则表达式提供了更简单的记法,这就是字符组简记(shorthands)。
常见的字符组简记有\d、\w、\s。其中d表示(digit)数字,w表示(word)单词,s表示(space)空白。
正则表达式也提供了对应排除型字符组的简记法:\D、\W、\S。字母完全相同,只是改为大写,这些简记法匹配的字符互补。
\d 数字,等同于[0-9]
\D 非数字,等同于[^0-9]
\s 空白字符,等同于[\n\r\t]
\S 非空白字符,等同于[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
\w 字母、数字、下划线,等同于[0-9A-Za-z_](汉字不属于\w)
\W 非字母、数字、下划线,等同于[^0-9A-Za-z_]
任意字符
人们一般认为点号可以代表任意字符,其实并不是,"."点号代表除回车(\r)、换行(\n) 以外的任意字符。妥善的利用互补属性,可以得到一些巧妙的效果。比如,[\s\S]、[\w\W]、[\d\D]都可以表示任意字符。
量词
{n} 匹配n次
{n,m} 匹配至少n次,最多m次
{n,} 匹配至少n次
? 相当于{0,1}
* 相当于{0,}
+ 相当于{1,}
贪婪模式
默认情况下,量词都是贪婪模式(greedy quantifier),即匹配到下一个字符不满足匹配规则为止:
//exec()方法以数组的形式返回匹配结果
/a+/.exec('aaa'); // ['aaa']
懒惰模式
懒惰模式(lazy quantifier)和贪婪模式相对应,在量词后加问号’?'表示,表示尽可能少的匹配,一旦条件满足就不往下匹配:
{n}? 匹配n次
{n,m}? 匹配至少n次,最多m次
{n,}? 匹配至少n次
?? 相当于{0,1}
*? 相当于{0,}
+? 相当于{1,}
/a+?/.exec('aaa'); // ['a']
括号
用于限定量词或选择项的作用范围,用于捕获文本并可以进行引用:
console.log(/(ab){2}/.test('abab'));//true
console.log(/(ab){2}/.test('abb'));//false
console.log(/ab{2}/.test('abab'));//false
console.log(/ab{2}/.test('abb'));//true
匹配模式
匹配模式(match mode)指匹配时的使用的规则。设置特定的模式,可能会改变对正则表达式的识别。前面已经介绍过创建正则表达式对象时,可以设置’m’、‘i’、'g’这三个标志,分别对应多行模式、不区分大小模式和全局模式三种:
i:默认地,正则表达式是区分大小写的,通过设置标志’i’,可以忽略大小写(ignore case)
console.log(/ab/.test('aB'));//false
console.log(/ab/i.test('aB'));//true
m:默认地,正则表达式中的^和$匹配的是整个字符串的起始位置和结束位置,而通过设置标志’m’,开启多行模式,它们也能匹配字符串内部某一行文本的起始位置和结束位置(multiline)
console.log(/world$/.test('hello world\n')); //false
console.log(/world$/m.test('hello world\n')); //trueconsole.log(/^b/.test('a\nb')); //false
console.log(/^b/m.test('a\nb')); //true
g:默认地,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配(global),设置’g’标志后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换
console.log('1a,2a,3a'.replace(/a/,'b'));//'1b,2a,3a'
console.log('1a,2a,3a'.replace(/a/g,'b'));//'1b,2b,3b'
优先级
正则表达式千变万化,都是由之前介绍过的字符组、括号、量词等基本结构组合而成的
//从上到下,优先级逐渐降低
\ 转义符
() [] 括号、字符组
* + ? {n} {n,} {n,m} 量词
^ $ 起始结束位置
| 选择
JS的正则表达式及详解相关推荐
- js 正则中冒号代表什么_javascript中正则表达式语法详解
好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...
- php 字符流在linux,PHP_linux正则表达式awk详解,awk和sed一样是流式编辑器,它 - phpStudy...
linux正则表达式awk详解 awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用 ...
- java 自定义正则表达式_java中正则表达式实例详解
Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...
- php 正则表达式 环视,php正则表达式环视详解
php正则表达式环视详解 1. 顺序肯定环视(?=exp) 零宽度正预测先行断言,又称顺序肯定环视,断言自身出现位置的后面能匹配表达式exp. 比如,匹配以"ing"结尾的单词前面 ...
- php正则实例,php 正则表达式实例详解(适合初学者)
正则表达式实例详解(适合初学者) 数学公式正则表达式: (?'kh'()*([- ]){0,1}[0-9.] (?'-kh'))*([ -*/]{1}(?'kh'()*((?<=()([- ]) ...
- php正则如何使用 1,PHP正则表达式使用详解(1)
PHP正则表达式使用详解(1) 一个正则表达式是一个特定的格式化模式,可以用来找出一个字符串在另一个字符串中的使用情况.几个编程语言,包括Visual Basic,Perl,JavaScript和PH ...
- nodejs 本地php服务器,node.js创建本地服务器详解
本文主要和大家分享node.js创建本地服务器详解,简易上手node.js后,我们就可以在自己电脑上创建本地服务器了.希望能帮助到大家. 一.先上代码.//请求Node.js自带的http模块. va ...
- shell中正则表达式详解_Shell if中的正则表达式使用详解
由于工作需要对用户提交的数据进行验证,这是一个简单的日期正则验证实例,有需要了解的同学可参考. shell中的if语句需要做一个正则判断,查了一下语法记录之. DATEPATTERN="^[ ...
- js打印三角形超详解
js打印三角形超详解 j控制星星的总行数,i控制每行星星的打印个数 打印图形如下: (1) (2) //str=""用来存储星星// 理解步骤1:在一行输出6个星星如何操作,在循环 ...
最新文章
- [Windows编程] 获取系统CPU 个数
- 关于git经常忘记的:远程仓库关联。
- [摘录]第一部分 掌舵领航(3)
- 中国楼宇自控系统发展规划现状及未来前景预测报告2022-2028年版
- opencv 画矩形_图像处理之OpenCV的基础使用补充
- 海外对鸿蒙的态度,谷歌、三星挑明态度,国内厂商集体拒绝鸿蒙?任正非将如何应对?...
- [Gradle] 在 Eclipse 下利用 gradle 构建系统
- CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)
- linux重启memcache_Linux中安装Memcached服务的方法
- 你应该知道的 HBase 基础,都在这儿了
- Servlet编程专题6之Cookie
- 春眠不觉晓,读书醒醒脑|世界读书日送送送10本硬核书
- 窗体分为左右两部分,要求在左边栏点击按钮时,右边动态加载窗体
- python通讯录的录入与测试_python实现手机通讯录搜索功能
- LiveData源码解析
- java sharepoint_java调用sharepoint webservice
- SEO理论实践的10大误区
- 美国信用评估机构遭黑客入侵,半数美国人受影响!
- 剑指offe面试题8 旋转数组的最小数字 (java实现)
- 电子制造企业如何避免仓库出货异常,导致客户大量退货?