正则表达式知识梳理

310 阅读7分钟

前言

正则表达式(Regular Expression)是一个描述字符模式的对象,具有强大的模式匹配和文本检索与替换功能。

一、创建方法

//1、字面量创建法
var reg = /a/g;

//2、构造函数创建法
var reg = new RegExp('a','g');

//其中a是元字符,g是修饰符,在后文会详细介绍。

二、常用修饰符

修饰符 含义
i 不区分大小写
g 全局查找(找到所有的匹配,而不是在找到第一个匹配字符后就停止)
m 多行匹配

三、正则表达式的属性和方法

1、属性: source 和 flags

    var reg = /a/g;
    console.log(reg.source);//a - 元字符
    console.log(reg.flags);//g - 修饰符

    // 应用:复制正则表达式
    var reg = /a/g;
    var reg1 = new RegExp(reg.source, reg.flags);
    console.log(reg1 === reg);   //false 两者都是对象,所以不相等

2、方法

(1)reg.test(str)

test:判断字符串中是否有符合正则规则的字符, 如果有就返回true, 否则返回false

     var reg = /a/g;
     console.log(reg.test('abcd')); //true
     console.log(reg.test('ABCD')); //false
 
//补充: 判断字符串中是否有某个字符的两种方法
//例子 判断str中是否有a
var str = 'abcd'
if (/a/.test(str)) { 
 //方法一
};
if (str.indexOf('a') > -1) { 
//方法二
}; 

(2)reg.exec(str)

exec: 在字符串中寻找正则规则的字符, 返回一个数组 (用得不多)
1)如果没找到返回null;
2)如果找到了返回该字符数组 (只能找到第一个)

    var reg = /b/gi;
    console.log(reg.exec("ABCabc"));
    // ["B", index: 1, input: "ABCabc", groups: undefined]
    // "B"    --> 目标查找的元素
    // index  --> 索引下标index
    // input  --> 查找的字符
    // groups --> 群组group

四、字符串相关方法

方法 重要程度
str.search( )
str.split( ) ☆☆
str.replace( ) ☆☆☆
str.match( ) ☆☆☆☆

search 查找

按照正则的规则查找字符
返回找到的第一个满足规则的元素下标不能全局查找
与indexOf方法相似

var str = "ab12ca3d4eA2f4g";
console.log(str.search(/[0-9]/));//2 查找出现的第一个数字的索引
console.log(str.indexOf("1"));   //2 查找第一次出现1时的索引

split 切割

按照正则表达式匹配内容,切割后返回数组

var str = "ab12ca3d4e";
var arr = str.split("2");  //用数字2切割 ["ab1", "ca3d4e"]
arr = str.split(/[0-9]/);  //用任意1个数字切割 ["ab", "", "ca", "d", "e"]
arr = str.split(/[0-9]+/); //用任意个数字切割  ["ab", "ca", "d", "e"]
str = str.split(/[0-9]+/).join(""); //相当于把所有数字删除
console.log(arr,str);


var str = 'abcdefg';  //用c或者f切割
console.log(str.split(/[cf]/g));//可以省略g,因为split默认是全局查找['ab','de','g']

replace 替换

参数类型一: 
    str.replace(正则,要替换的内容)
    
参数类型二:   
    str.replace(正则,回调函数(item,index){
                return 返回要替换的内容
                }) 
    //  这里的回调函数类似数组遍历,可以return也可以不return
// 1)普通参数
    var str = "ab12ca3d4eA2f4g";
    // 通过正则修饰符 全局替换所有满足规则的字符
    str = str.replace(/a/gi, "z");      // 把所有的a换成z
    str = str.replace(/[df]/ig, "z");   // 将字符d或者f替换成z
    str = str.replace(/[0-9]/ig, "");   // 删除所有数字


// 2)第二个参数传入函数
    // 例2.1 第一个a替换成x 其他的a替换成y
    var str = 'abcadeafgh';
    str = str.replace(/a/g, function (item, index) {
        return index === 0 ? 'x' : 'y';
    })
    console.log(str);


    // 例2.2 查找所有a字符的下标
    var str = 'abcdeafgh';
    var arr = [];
    str.replace(/a/g, function (item, index) {
        // 把符合规则的index放入数组中
        arr.push(index);
    })
    console.log(arr);

    // (把不同的内容的替换成同一个内容)
    // 例2.3 把所有的a或c或e替换成0 
    var str = 'abcdeafgh';
    str = str.replace(/[ace]/g, '0');
    console.log(str);

    //(把不同的内容换成不同的内容)
    // 例子2.4:把英文字符替换成数字
    var str = "ab78Ca9d";
    var num = 0;
    //           [a-z]是替换单个元素  [a-z]+是可以替换多个元素成1个元素
    str = str.replace(/[a-z]/gi, function (item, index) {
        return ++num;
    })
    console.log(str);//'12783495'


    // 例子2.5  把所有的a替换成1,把所有b替换成2,把所有c替换成3
    var str = 'abcdeabcfgabc';
    str = str.replace(/[abc]/g, function (item) {
        switch (item) {
            case 'a': return '1';
            case 'b': return '2';
            case 'c': return '3';
        }
    })
        

match 查找

查找到符合规则的字符 -- [返回数组]

a. 如果添加全局g,会返回找到的所有元素组成的数组
b. 如果没有全局g,且没有加[群组]效果与exec一致
c. 如果没有全局g,且加了[群组],返回一个数组(第0个元素是查找到的字符,往后的元素是找到的符合群组规则的元素+input等内容)

var str = "ab12ca3d4eA2f4g";
console.log(str.match(/a/i)); // (类型b)没有增加修饰符: 效果与exec相同
//["a", index: 0, input: "ab12ca3d4eA2f4g", groups: undefined]
console.log(str.match(/a/gi));// (类型a)增加修饰符g: 以数组的形式罗列出来查找到的内容
//["a", "a", "A"]

// 只要添加了全局g,返回的就是找到的元素组成的数组
console.log(str.match(/2([a-z])/g));// (类型a)查找开头是2,后面紧跟一个字母的字符,可以找出全部,并且以数组展示
//["2c", "2f"]
console.log(str.match(/2([a-z])/));// (类型c)查找开头是2,后面紧跟一个字母的字符(2c 2f),只能找出第一个
//["2c", "c", index: 3, input: "ab12ca3d4eA2f4g", groups: undefined]

console.log(str.match(/(2)([a-z])/));//c如果使用群组,match还可以区分群
//["2c", "2", "c", index: 3, input: "ab12ca3d4eA2f4g", groups: undefined]



// 例子加深理解群组()的作用  ()和全局g两者不可兼得 ————————————
var str = "中国有四大名著,分别是<西游记>、<水浒传>、<红楼梦>、<三国演义>,他们都是经典小说";
// a. 全局查找'<书名>'
console.log(str.match(/\<.*?\>/g));   //["<西游记>", "<水浒传>", "<红楼梦>", "<三国演义>"]
// b. 虽然加了(),但是和a的效果相同,因为有全局g,()失效  无法实现不能只要书名不要书名号
console.log(str.match(/\<(.*?)\>/g)); // ["<西游记>", "<水浒传>", "<红楼梦>", "<三国演义>"]
// c. 只要书名不要书名号,但是只能获取到第一个'西游记',因为没有g
console.log(str.match(/\<(.*?)\>/)[1]); //'西游记' 
    
    
 // 对比例子
// a.无群组,有全局g,返回找到的数组
console.log('12abc34ab56'.match(/[a-z]+\d+/g));   //["abc34", "ab56"]
// b.有群组,又有全局查找g,()群组失效,故和例a等效
console.log('12abc34ab56'.match(/[a-z]+(\d+)/g));//["abc34", "ab56"] 
// c.有群组,且没有全局g,只得到括号里的数字 
console.log('12abc34ab56'.match(/[a-z]+(\d+)/)[1]);//34
//["abc34", "34", index: 2, input: "12abc34ab56", groups: undefined]

元字符

字符 含义 备注
. 代表任意一个字符
元字符放在[]内会失效,[.]代表.本身,不再代表任意字符
^ 匹配输入字符串的开始位置 其他含义
^在[]内第一位: 表示反义符
^在[]内非第一位: 表示^字符本身
$ 匹配输入字符串的结束位置
{n} 匹配确定的 n 次 abc{2} 代表c重复2次,不是abc重复两次
=>注意与[^abc]的区别,代表非abc
{n,} 至少匹配n 次 默认贪婪匹配
{n,m} 最少匹配 n 次且最多匹配 m 次 默认贪婪匹配
* 等价于{0,} 匹配0次或多次
+ 等价于{1,} 匹配1次或多次
? 等价于{0,1} 匹配0次或1次
? 紧跟在其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,代表非贪婪匹配
x|y 匹配 x 或 y 例如,'z|food' 指匹配 "z" 或 "food;
'(z|f)ood' 指匹配 "zood" 或 "food"
[xyz] 字符集合,匹配所包含的任意一个字符 []中括号里的内容可以匹配任意[一个]内容
[^xyz] 匹配未包含的任意字符 表示(非x 非y 非z),而不是(非x、y、z)
^在[]内第一位: 表示反义符
^在[]内非第一位: 表示^字符本身
[a-z]
\d
\D
\w 数字字母下划线,等价于'[A-Za-z0-9_]'
\W 非数字字母下划线,等价于 '[^A-Za-z0-9_]'