JavaScript 正则表达式入门教程
正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串
主要分三个部分:基本语法、RegExp对象的方法、JS中支持正则表达式的String对象方法
一、基本语法
在JS中,正则表达式为对象,用如下两种方式定义:
直接量法: /pattern/attributes;创建RegExp对象法:new RegExp(pattern,attributes);
var reg=/hi/i;//字面量
var reg=new RegExp('hi','i');//构造函数(参数1:最简单的正则匹配字母hi;参数2:表示匹配时不分大小写)
元字符:( [ { ^ $ | ) ? * + .(若匹配元字符本身需要转义)
1、直接量
最简单的正则匹配模式,使用字符本身进行匹配
var reg=/hi/;//匹配一个hi字符
2、元字符
元字符是一些符号和字母的组合,用来替代普通字符,元字符有.dws等,详见附表
var reg=/./;// .表示除换行符以外的任一字符
var reg=/d/;// d表示0-9的数字
...
3、字符转义
如果需要查找元字符本身,则需要在元字符之前加进行转义
var reg=/./;//匹配一个.
var reg=/\/;// 匹配一个
4、重复
量词用于限定它前面表达式匹配的次数,有*+?{}等
var reg=/ddd/;//匹配3个数字
var reg=/d*/;//匹配任意数量数字,可能是0个
var reg=/d+/;//匹配1个到多个数字
var reg=/d?/;//匹配0到1个数字
var reg=/d{3}/;//匹配3个数字
var reg=/d{3,}/;//匹配3到多个数字
var reg=/d{3,6}/;//匹配3到6个数字
5、字符类
在[]的范围中添加字符,在中括号内的元字符不需要进行转义‘-’表示至,它的作用为在括号中任选其一
var reg=/[abc]/;//匹配'a','b','c'其中之一
var reg=/[() +]/;//匹配'(',')',' ','+',''其中之一,[]内部不需要转义
var reg=/[0-9a-z]/;//匹配0至9和a至z,即[0123456789abcdefghijklmnopqrstuvwxyz]
var reg=/[0-9][a-z]/;//匹配前一个数字后一个字母的两位字符,区别于上述匹配一位字符
6、分支条件
使用|把不同规则分隔开,类似条件选择,从左到右依次测试每个条件,满足其中任一条件即可,当满足某个分枝成功后就不再管其它的分支了
var reg=/0d{2}-d{8}|0d{3}-d{7}/;//匹配固定电话:前3后8或前4后7,即021-12345678或0553-7654321
7、分组
使用()来包裹子表达式,以便对这部分子表达式整体操作,如重复或后向引用
var reg=/((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)/;//匹配IP地址
//意思为:((一个不大于255的数字)+‘.’)整体重复三次+(一个不大于255的数字)
8、反义
查找不属于指定类型以外的字符,有DWS[^]等,其中D等价于[^d] 除数字以外任意字符
var reg=/[^abc]/;//匹配一个不是abc的字符,即除abc以外的任一字符
9、后向引用
使用()分组匹配的子表达式,将自动拥有一个分组编号,可用于后续重复引用
var reg=/((2[0-4]d|25[0-5]|[01]?dd?).){3}2/;//这里有分组有嵌套,1代表外层分组(下划线),2表示内层分组(红色)
可以自定义分组编号(即命名)语法为:(?<name>exp)或(?'name'exp),将分组命名为name,再反向引用时语法为:k<name>
var reg=/((?<name>2[0-4]d|25[0-5]|[01]?dd?).){3}k<name>/;//给分组2命名为name,后续可用该名称来引用
还可以忽略当前分组获得自动编号(即隐藏分组),语法为(?:exp)
var reg=/(?:(2[0-4]d|25[0-5]|[01]?dd?).){3}1/;//因为第一个分组被忽略,原来的分组2变为了分组1
10、零宽度断言(也称环视)
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,类似b^$指定一个位置,这个位置要满足一定的条件(断言)
(?=exp)正前瞻,自身出现的位置的后面能匹配表达式exp,如:bw+(?=ingb),匹配以ing结尾的单词的前面部分,等同于下划线部分
(?!exp)反前瞻,自身出现的位置的后面不能匹配表达式exp,如:babc(?!ingb),匹配不以ing结尾的abc开头单词的abc,等同于下划线部分
(?<=exp)正后顾,自身出现的位置的前面能匹配表达式exp,如:(?<=bre)w+b,匹配以re开头的单词的后半部分,等同于下划线部分(JS不支持)
(?<!exp)反后顾,自身出现的位置的前面不能匹配表达式exp,如:(?<!bre)abcb,匹配以re开头的abc结尾单词的abc,等同于下划线部分(JS不支持)
var str='reading';
var reg=/read(?=ing)/g;//正前瞻:在我们捕获read这个字符串时,筛选它接下来的字符串是不是ing
console.log(str.match(reg)[0]);//read
11、贪婪和懒惰
正则表达式匹配时,通常在使整个表达式能得到匹配的前提下,会匹配尽可能多的字符,这被称为贪婪匹配若需要懒惰匹配(即尽可能少的字符),那么只要在限定重复的软性量词后加?即可
var str='aabab';
console.log(str.match(/a.*b/)[0]);//aabab 默认贪婪模式
console.log(str.match(/a.*?b/)[0]);//aab 开启懒惰模式
代码/语法 |
说明 |
---|---|
*? |
重复任意次,但尽可能少重复 |
+? |
重复1次或更多次,但尽可能少重复 |
?? |
重复0次或1次,但尽可能少重复 |
{n,m}? |
重复n到m次,但尽可能少重复 |
{n,}? |
重复n次以上,但尽可能少重复 |
12、处理选项
即匹配规则,是否忽略大小写,多行等
名称 |
说明 |
---|---|
IgnoreCase(忽略大小写) |
匹配时不区分大小写。 |
Multiline(多行模式) |
更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配n之前的位置以及字符串结束前的位置.) |
Singleline(单行模式) |
更改.的含义,使它与每一个字符匹配(包括换行符n)。 |
IgnorePatternWhitespace(忽略空白) |
忽略表达式中的非转义空白并启用由#标记的注释。 |
ExplicitCapture(显式捕获) |
仅捕获已被显式命名的组。 |
附表:常用元字符详解
元字符 |
类型 |
说明 |
---|---|---|
特殊 |
转义符号,或将下一个字符标记为特殊字符(如d) |
|
| |
特殊 |
分支条件,类似条件选择把不同规则分隔开 |
() |
特殊 |
分组 |
[] |
特殊 |
限定字符,如[abc] |
[^] |
特殊 |
负值字符串,如[^abc]除abc以外的任何字符 |
{} |
特殊 |
限定次数 |
^ |
位置 |
匹配字符串的开始 |
$ |
位置 |
匹配字符串的结束 |
b |
位置 |
单词的开头或结尾,也就是单词的分界处 |
* |
量词 |
重复零次或更多次(任意次) |
+ |
量词 |
重复一次或更多次(至少出现一次) |
? |
量词 |
重复零次或一次(最多出现一次) |
{n} |
量词 |
重复n次,n为数字 |
{n,} |
量词 |
重复n次到无数次 |
{n,m} |
量词 |
重复n次到m次 |
. |
匹配 |
匹配除换行符以外的任意字符 |
d |
匹配 |
匹配一个数字字符,等价于[0-9] |
w |
匹配 |
匹配字母或数字或下划线或汉字,只考虑英文情况下等价于[a-zA-Z0-9_] |
s |
匹配 |
匹配任意的空白符 |
二、RegExp对象的方法
1、test()
基本语法:RegExpObject.test(str);
该方法用于检测一个字符串是否匹配某个模式(即给定的字符串使用该正则是否能匹配到内容),返回一个布尔值
var str="hello world";
var regexp=new RegExp("hello");//构造函数创建RegExp对象
console.log(regexp.test(str));//true
console.log(/hi/.test(str));//false,//字面量
2、exec()
基本语法:RegExpObject.exec(str);
该方法用于检索字符串中的正则表达式的匹配,返回一个匹配结果的数组,如果没有匹配返回null;不是全局的情况下与match()方法返回的数值相同
var str="hello world";
console.log(/hello/.exec(str));//["hello", index: 0, input: "hello world"]
//第一为匹配的内容,第二为匹配的索引位置,第三为字符串本身
console.log(/hi/.exec(str));//null
console.log(/ello/.exec(str).index);//1 //index和input可以直接作为该方法返回的两个属性
三、JS中支持正则表达式的String对象方法
1、search()
查找:stringObject.search(regexp/str);
该方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的字符串,它不执行全局匹配(将忽略标志g),也没有regexp对象的lastIndex属性,且总是从字符串开始位置进行查找,总是返回的是stringObject匹配的第一个位置
var str = "hello";
console.log(str.search(/l/)); //2 返回匹配到的第一个位置(使用的regexp对象检索)
console.log(str.search('l')); //2 使用字符串进行匹配
console.log(str.search(/l/g)); //2 没有全局的概念 总是返回匹配到的第一个位置
console.log(str.search(/L/i)); //2 可以忽略大小写来检索
console.log(str.search(/a/)); //-1,如果没有检索到的话,则返回-1
2、match()
匹配:stringObject.match(regexp/str)
该方法用于在字符串内检索指定的值,或找到一个或者多个正则表达式的匹配。该方法类似于indexOf()或者lastIndexOf(); 但是它返回的是指定的值,而不是字符串的位置;
var str = "hello";
console.log(str.match(/e/)); //["e", index: 1, input: "hello"] 返回一个数组,包括匹配到的字符,位置和自身
console.log(str.match('e'));//["e", index: 1, input: "hello"] 支持用字符串代替正则进行匹配
console.log(str.match(/l/g));//["l", "l"]支持全局匹配,返回匹配到的字符组成的数值
3、replace()
替换:stringObject.replace(regexp/str,str/function);
该方法用于在字符串中使用一些字符替换另一些字符,或者替换一个与正则表达式匹配的子字符串;默认只替换第一个匹配的字符,可以加修饰符g进行全局替换。整体返回替换后的新字符串。
var str = "hello world";
console.log(str.replace("hello","a"));// a world,使用字符串匹配并替换
console.log(str.replace(/hello/,"b"));// b world,使用正则匹配并替换
console.log(str.replace(/l/g,""));// heo word,使用正则加装饰符g进行全局替换
console.log(str.replace(/(hello)[ ](w+)/g,"$2 $1"));// world hello,$1,$2 代表正则中第一个和第二个分组所匹配的文本
//第二个参数是function函数
console.log(str.replace(/o/g,function(v){
console.log(v);//打印2次o
return '-';
}));//hell- w-rld,匹配替换为函数的返回值
console.log(str.replace(/(e).*(o)b/g,function(){
console.log(arguments);//["ello", "e", "o", 1, "hello world"]
//第一个匹配的字符,第二和第三是分组匹配的内容,第四是匹配索引位置,第5个是原字符串
return 'i';
}));// hi world
4、split()
分割:stringObject.split(regexp/substr,[length]);
该方法把一个字符串分割成字符串数组,length设定返回数组的长度即超出部分将被忽略(可选参数)
var str = "hello world";
console.log(str.split(" ");//["hello", "world"],使用字符分割为数组
console.log(str.split(/o/g));//["hell", " w", "rld"],使用正则匹配的内容来分割
console.log(str.split(/o/g,2));//["hell", " w"],指定返回数组的length
- Step By Step 一步一步写网站[1] —— 帧间压缩,表单控件
- [WCF-Discovery]如何利用”发现代理”实现可用服务的实时维护?
- 深度学习与机器学习
- Step By Step 一步一步写网站[1] —— 填加数据(二)
- [WCF-Discovery]让服务自动发送上/下线通知[原理篇]
- [WCF-Discovery]让服务自动发送上/下线通知[实例篇]
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]
- [自定义服务器控件] 第一步:文本框。
- 检查两个数据库里的表名、字段是否一致的一种方法
- 如何在Python中从零开始实现随机森林
- 基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)
- 使命必达: 深入剖析WCF的可靠会话[协议篇](下)
- 分页控件和几个相关控件的源代码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用gogs轻松搭建个人的git服务器
- Centos7 activemq启动失败 解决 的正确姿势 实践笔记
- 所谓并发编程,所谓有其三
- Redis 中的 3 种特殊数据类型
- 关于 “栈” 的那点破事
- 【为宏正名】for的妙用你想不到
- Centos 7 下 docker 导入导出镜像 实践笔记
- linux(centos)搭建.net core 运行环境
- 11g RAC 在线存储迁移实现 OCR 磁盘组完美替换
- MAC下 Centos7 下 免账号免密码便捷登录服务器的正确姿势 实践笔记
- AnimatedList 介绍及使用
- Flutter之SliverAppBar
- OpenGL ES 环境搭建
- Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署
- Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署