JavaScript正则表达式

JavaScript的正则表达式

一、使用方式简单介绍:

1.字面量
(1)

let reg = /is/;
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));

结果:

She IS a beautiful girl.He is a handsome boy.You are a dog.

(2) 这里只替换了第一个is,如果要全局替换,在后面加个g

let reg = /is/g;
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));

结果:

She IS a beautiful girl.He IS a handsome boy.You are a dog.

2.构造函数
(1)

let reg = new RegExp('\bis\b');
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));

结果:

She IS a beautiful girl.He is a handsome boy.You are a dog.

(2) 如果要全局替换,在后面加个g

let reg = new RegExp('\bis\b', 'g');
let test = 'She is a beautiful girl.He is a handsome boy.You are a dog.';
layer.alert(test.replace(reg, 'IS'));

结果:

She IS a beautiful girl.He IS a handsome boy.You are a dog.

匹配符:

  • g : global全局搜索,默认不添加,匹配到第一个停止
  • i : ignore case忽略大小写,默认大小写敏感
  • m : multiple lines多行搜索

二、元字符

  • 应注意这些  *  +  ?  $  ^  .  |  (  )  {  }  [  ]

三、字符类

1.将abc中任意字符替换成M

let reg = /[abc]/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'M'));

结果:

1M2M3M4d

2.取反,除了abc以外的所有字符都替换成M

let reg = /[abc]/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'M'));

结果:

MaMbMcMM

四、范围类

let reg = /[a-zA-Z]/g;
let test = '1a2b3c4d5A6F7X8Z';
layer.alert(test.replace(reg, 'M'));

结果:

1M2M3M4M5M6M7M8M

五、预定义类

  • . 除了回车符和换行符以外的所有字符
  • d 数字字符
  • D 非数字字符
  • s 空白字符
  • S 非空白字符
  • w 单词字符(字母、数字、下划线)
  • W 非单词字符
  • D 非数字字符
  • D 非数字字符
  • D 非数字字符
  • D 非数字字符

边界匹配字符:

  • ^ 以xxx开始
  • $ 以xxx结尾
  •  单词边界
  • B 非单词边界

六、量词

  • ? 至多出现一次
  • + 至少出现一次
  • * 出现任意次
  • {n} 出现n次
  • {n,m} 出现n到m次
  • {n,} 至少出现n次
  • {0,m} 最多出现m次

七、贪婪模式与非贪婪模式

1.贪婪模式(尽可能多的匹配)

let reg = /d{3,6}/g;
let test = '12345678';
layer.alert(test.replace(reg, 'X'));

结果:

X78

2.非贪婪模式(尽可能少的匹配)

let reg = /d{3,6}?/g;
let test = '12345678';
layer.alert(test.replace(reg, 'X'));

结果:

XX78

八、分组

1.匹配数字加小写字母连续出现3次的场景

let reg = /(d[a-z]){3}/g;
let test = '1a2b3c4d';
layer.alert(test.replace(reg, 'X'));

结果:

X4d

2.或

let reg = /1a2b3c(4d|5e)6f7g8h/g;
let test = '1a2b3c4d6f7g8h 1a2b3c5e6f7g8h';
layer.alert(test.replace(reg, 'X'));

结果:

X X

3.反向引用(捕获分组中内容)

let reg = /(d{4})-(d{2})-(d{2})/g;
let test = '2019-10-30';
layer.alert(test.replace(reg, '$2/$3/$1'));

结果:

10/30/2019

注:

let reg = /(?:d{4})-(d{2})-(d{2})/g; //忽略第一个分组

九、前瞻

例1.

let reg = /w(?=d)/g;
let test = 'a1b2c^d$';
layer.alert(test.replace(reg, 'X'));

结果:

X1X2c^d$

例2.

let reg = /w(?!d)/g;
let test = 'a1b2c^d$';
layer.alert(test.replace(reg, 'X'));

结果:

aXbXX^X$

js无后顾!!!

十、对象属性

  • global : 全局搜索,默认不添加,匹配到第一个停止,默认false
  • ignoreCase : 忽略大小写,默认大小写敏感,默认false
  • multiline : 多行搜索,默认false
  • lastIndex : 当前表达式匹配内容的最后一个字符的下一个位置
  • source : 文本字符串

例:

let reg = /w/g;
layer.alert(reg.global+"</br>"+
            reg.ignoreCase+"</br>"+
            reg.multiline+"</br>"+
            reg.lastIndex+"</br>"+
            reg.source);

结果:

true
false
false
0
w

十一、test和exec方法

1.test方法,找到当前匹配位置的索引(全局调用)

let reg2 = /w/g;
let result = '';
while(reg2.test('abcdef')){
    result += reg2.lastIndex + '</br>';
}
layer.alert(result);

结果:

1
2
3
4
5
6

2.exec方法

如果没有匹配的文本则返回null,否则返回一个结果数组

  • index 声明匹配文本的第一个字符的位置
  • input存放被检索的字符串string

(1).非全局调用

  • 第一个元素是与正则表达式相匹配的文本
  • 第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话)
  • 第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话)
  • 以此类推...

例.

let reg1 = /d(w)d/;
let ts = '1a2b3c4d5e';
let ret = reg1.exec(ts);
let result = '';

result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;
result += '</br>';
result += reg1.lastIndex + ' ' + ret.index + ' ' + ret;

layer.alert(result);

结果:

0 0 1a2,a
0 0 1a2,a

(2).全局调用

例.

let reg2 = /d(w)d/g;
let ts = '1a2b3c4d5e';
let ret = '';
let result = '';

while(ret = reg2.exec(ts)){
    result += reg2.lastIndex + ' ' + ret.index + ' ' + ret;
    result += '</br>';
}
layer.alert(result);

结果:

3 0 1a2,a
7 4 3c4,c

十二、字符串对象方法

1.search()方法

  • search()方法用于检测字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
  • 方法返回第一个匹配结果index,查找不到返回-1
  • search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索

2.match()方法

  • match()方法将检索字符串,以找到一个或多个与regExp匹配的文本
  • regexp是否具有标志g对结果影响很大

(1).非全局调用

  • 返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
  • 除了常规的数组元素之外,返回的数组还含有2个对象属性
  • index声明匹配文本的起始字符在字符串的位置
  • input声明对stringObject的引用

例:

let reg1 = /d(w)d/;
let ts = '1a2b3c4d5e';
let ret = ts.match(reg1);
let result = '';

result += ret + ' ' + ret.index + ' ' + reg1.lastIndex;
layer.alert(result);

结果:

1a2,a 0 0

(2).全局调用

  • 如果regexp具有标志g则match()方法将执行全局检索,找到字符串中的所有匹配字符串
  • 没有找到任何匹配的字串,则返回null
  • 如果找到了一个或多个匹配字串,则返回一个数组
  • 数组元素中存放的是字符串中所有的匹配字串,而且也没有index属性或input属性

例:

let reg2 = /d(w)d/g;
let ts = '1a2b3c4d5e';
let ret = ts.match(reg2);
let result = '';

result += ret + ' ' + ret.index + ' ' + reg2.lastIndex;
layer.alert(result);

结果:

1a2,3c4 undefined 0

3.split()方法

将字符串分割为字符数组

例:

let reg1 = /d/g;
let ts = '1a2b3c4d5e';
let ret = ts.split(reg1);
console.log(ret) //layer不支持数组的弹出,所以改为console

结果:

["", "a", "b", "c", "d", "e"]

4.replace()方法

例1:

let reg1 = /1/g;
let ts = '1a1b1c1d1e';
let result = ts.replace(reg1, 2);
layer.alert(result);

结果:

2a2b2c2d2e

replace第二个参数也可以为一个function
function会在每次匹配替换的时候调用,有四个参数
(1).匹配字符串
(2).正则表达式分组内容,没有分组则没有该参数
(3).匹配项在字符串中的index
(4).原字符串

例2:没有分组

let reg1 = /d/g;
let ts = '1a2b3c4d5e';
let ret = ts.replace(reg1, function(match, index, origin){
    console.log(index);
    return parseInt(match)+1;
});
console.log(ret);

结果:

0
2
4
6
8
2a3b4c5d6e

例3:有分组(注意参数有变化)

let reg1 = /(d)(w)(d)/g;
let ts = '1a2b3c4d5e';
let ret = ts.replace(reg1, function(match, group1, group2, group3, origin){
    console.log(match);
    return group1 + group3;
});
console.log(ret);

结果:

1a2
3c4
12b34d5e

附视频链接:
https://www.imooc.com/video/12529

原文地址:https://www.cnblogs.com/zqm-sau/p/11766497.html