正则表达式

正则就是对字符串进行查找、匹配、替换等操作的一串“规则字符串”

使用方法:在一对斜杠之间添加正则表达式 如:/ 正则表达式 /

正则表达式的组成

  • 普通字符
  • 特殊字符(元字符):正则表达式中具有特殊意义的字符

元字符

\d 表示数字
\D 非数字
\s 空格符
\S 非空格符
\w 字母或数字或下划线
\W 非字母、数字、下划线
. 任意字符(不包含换行符)
\b 单词边界

实例1:

1
2
3
4
var reg = /\d/; //新建一个正则对象
var str = '1';
console.log(reg.test(str)); //true str中含有数字
//test()是正则对象中的一个方法,它会判断str是否满足正则表达式,返回boolean

限定符

限定之前表达式出现的次数

* 重复0次或多次
+ 重复1次或多次
重复0次或1次
{n} 重复n次 (连续)
{n,} 重复至少n次 (连续)
{n,m} 重复n到m次 (连续)
1
2
3
var reg = /\d*/;
console.log(reg.test('w'));//true
console.log(reg.test('12'));//true
1
2
3
var reg = /\d+/;
console.log(reg.test('w'));//false
console.log(reg.test('12'));//true
1
2
3
4
5
6
7
8
var reg = /\d?/;
console.log(reg.test('w'));//true
console.log(reg.test('12'));//true
console.log(reg.test('w12'));//true

//这里12出现了两次,不满足“重复0次或1次”的条件为什么显示为true呢?
//当执行test()时,只要字符串中有部分满足条件则返回true)
//解决办法var reg = /^\d?$/; 加上开始结束符(后面会介绍)
1
2
3
4
5
6
var reg = /\d{2}/;//{n}
console.log(reg.test('2'));//false
console.log(reg.test('23'));//true
console.log(reg.test('2w3'));//false 不连续时匹配失败
console.log(reg.test('234'));//true (理应为false)原因同上
console.log(reg.test('ab234'));//true (理应为false)原因同上 解决办法同上
1
var reg = /\d{2,}/;//{n,}  //同样存在以上问题
1
var reg = /\d{2,6}/;//{n,m}  //同样存在以上问题

范围符[ ]

1、[a-z]、[A-Z]、[0-9],也可以综合写成[a-zA-Z0-9];当然这范围是自己定义的,比如[a-b],范围是a到b。

2、[\u4e00-\u9fa5] 匹配汉字的范围 其中\u4e00,\u9fa5是中日韩汉字Unicode表中对应的编码 4e00对应“一” 9fa5对应“龥”

中日韩汉字Unicode表

3、[ab5&@],仅匹配 a 或 b 或 5 或 & 或 @

4、[^ab5&@] 匹配除 a 或 b 或 5 或 & 或 @之外的内容 (注意此处^是在[ ]内的,区别于开始符^,两者所处位置不同)

5、3 | a 匹配3或者a字符

开始结束符号

^ 开始符(强制规定匹配开始的地方)
$ 结束符(强制规定匹配结束的地方)

实例:

1
2
3
4
5
6
7
^\d 字符串要以数字开始,数字只能出现一次
\d$ 字符串要以数字结束,数字只能出现一次
^\d$ 字符串要以数字开始和结束,数字只能出现一次

\d+$ 字符串要以数字开始,以数字结束,数字只能出现一次

^\d?$ 字符串要以数字开头和结束,数字出现0次或1次

我们来解释 var reg = /\d?/; 例子中出现的问题

1
2
3
4
5
6
7
8
9
var reg = /\d?/;
console.log(reg.test('w'));//true
console.log(reg.test('12'));//开始检测,当检测到 1 时,因为满足了数字出现0次,匹配成功,返回true,此时结束位置在1和2之间

//加入开始结束符
var reg = /^\d?$/;
console.log(reg.test('w'));//true
console.log(reg.test('12'));//当加入开始结束字符后,开始匹配位置强制从1开始 2结束
//则12是由两个数字的 不符合“重复0次或1次”的条件,则为false

我们来解释 var reg = /\d{2}/; 例子中出现的问题

1
2
3
4
5
6
7
8
9
10
11
var reg = /\d{2}/;//{n}
console.log(reg.test('2'));//false
console.log(reg.test('23'));//true
console.log(reg.test('234'));//true 开始字符为2 结束字符为3
console.log(reg.test('ww234'));//true 开始字符为2 结束字符为3

var reg = /^\d{2}$/;//{n}
console.log(reg.test('2'));//false
console.log(reg.test('23'));//true
console.log(reg.test('234'));//false 开始字符为2 结束字符为4
console.log(reg.test('ab234'));//false 开始字符为a 结束字符为4

正则对象的创建方式

1、new RegExp()

RegExp(reg,msg) 参数一:正则表达式

​ 参数二:附加条件(如:i 忽略大小写,g 全局匹配)

实例:

1
2
3
4
var reg = new RegExp('\\w+','ig');  //注意,此处第一个\是转义字符,因为参数一不能直接传入正则表达式
var reg = new RegExp('[a-z]','ig');
var str = "AaaC2_";
console.log(reg.test(str));//true

2、简写

1
2
3
var reg = /[a-z]/ig;
var str = "AaaC2_";
console.log(reg.test(str));//true

正则对象的方法

RegExp.test(‘字符串’); 判断字符串知否满足正则表达式 返回布尔值

RegExp.exec(‘字符串’); 判断字符串知否满足正则表达式 将找到的内容以数组的形式返回

1、不使用 “g“ 标志时,每次都返回第一个找的内容 而不继续向后查找

2、当正则表达式使用 “g“ 标志时,可以多次执行 exec 方法来查找同一个字符串中的成功匹配。当你这样做时,查找将从正则表达式的 lastIndex 属性指定的位置开始

lastIndex:

只有正则表达式使用了表示全局检索的 “g“ 标志时,该属性才会起作用。此时应用下面的规则:

  • 如果 lastIndex 大于字符串的长度,则 regexp.testregexp.exec 将会匹配失败,然后 lastIndex 被设置为 0。
  • 如果 lastIndex 等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从 lastIndex 开始的字符串。(then the regular expression matches input starting at lastIndex.)
  • 如果 lastIndex 等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex 被设置为 0.。
  • 否则,lastIndex 被设置为紧随最近一次成功匹配的下一个位置。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//找出所有三个英文字母组成的  并且以A开头的单词
var str = 'Asd Asss wes sgetgs x Adv Wdf';
var reg = /\bA[A-Za-z]{2}\b/g;
console.log(reg.lastIndex);//初始值为0
var word = reg.exec(str);//¥1¥
console.log(reg.lastIndex);//3
while(word){
console.log(word);
word = reg.exec(str);//¥2¥
console.log(reg.lastIndex);
}
onsole.log(word);//null
console.log(reg.lastIndex);//0

该函数运行的实质:exec每一次执行都有开始位置,而这个开始位置是由RegExp对象的lastIndex属性值所决定的;

以下为该段代码的执行顺序与解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、reg.lastIndex 的初始值为0

2、执行¥1¥处的exec时,当前的lastIndex数值为0,则exec从字符串的0位置(即A字符)开始。执行结束,将**所找的字符串**(Asd)以数组的形式返回给word,并修改reg.lastIndex的值为" **所找到的字符串最后一个的位置的下一个位置** "(也就是d下标加一,为3),

3、执行while循环,word此时为[Asd]数组,while语句判断成功

4、执行¥2¥处的exec,此时reg.lastIndex为3,则从字符串中下标为3的字符开始执行,找到 "Adv", v的下标为24,则reg.lastIndex的值被设置为25,word此时为[Adv]数组

5、判断while 成功

6、执行¥2¥处的exec,此时reg.lastIndex为25,则从字符串中下标为25的字符开始执行,未找到满足条件的内容,则返回null给word,并将reg.lastIndex设为0;

7、判断while,此时word为null,判断失败,则跳出循环

8、程序结束

懒惰模式与贪婪模式

懒惰模式:在满足条件的前提下,尽可能的匹配字符

贪婪模式:在满足条件的前提下,尽可能的匹配字符

正则表达式的量词有:* + ? {}

量词默认是贪婪模式,当在量词之后加上?时,将贪婪模式转换为懒惰模式。

分组提取

正则中()表示分组

若存在

1
((((a))((b)))(c))

则第一组;(((a))((b)))(c)

第二组:((a))

第三组:(a)

第四组:(b)

第五组:(c)

找法:从左往右找左括号(

实例:

1
2
3
4
5
6
7
8
var reg = /((\d+)(\w+))/;
var str = "123abc_c"
if(reg.test(str)){
//$后的数字 类似数组的下标
console.log(RegExp.$1);//获得第一组(\d+)(\w+)的内容 则是123abc_c
console.log(RegExp.$2);//获得第二组(\d+)的内容 则是123
console.log(RegExp.$3);//获得第二组(\w+)的内容 则是abc_c
}

字符串中正则的使用

方法:

String.match(正则对象) 返回符合正则条件的集合
String.replace(正则对象,”替换的字符串”) 替换字符串,若要全局替换,正则对象要加g
String.search(正则对象) 查找字符串,返回查找内容的第一次出现的位置
String.split(正则对象) 切割字符串,返回切割后的数组
1
2
3
4
5
6
7
8
//match
var str="abc123ee23f90";
//将字符串中所有出现的每一个数字提取出来
var arr = str.match(/\d/g);
console.log(arr);
//将字符串中所有出现的连续的数字提取出来
var arr = str.match(/\d+/g);
console.log(arr);
1
2
3
4
5
//replace
//替换所有 - +
var str = "a-b-+b-c";
console.log(str.replace(/-|\+/g,"*"));//结果a*b**b*c
//若不加g 则结果为a*b-+b-c
1
2
3
4
//search
//忽略大小写 找到第一个b的下标
var str = "a-b-b-c";
console.log(str.search(/B/i));//结果2
1
2
3
//split
var str="a|b|c|";
console.log(str.split(/\|/));//结果 "a","b","c",""

最后更新: 2019年05月15日 14:02

原始链接: https://HowlCN1997.github.io/2019/05/14/正则表达式/

× 请我吃糖~
打赏二维码