boxmoe_header_banner_img

Hello! 欢迎来到盒子萌!

加载中

文章导读

22正则表达式


avatar
Jack 2022年 11月 22日 147

正则表达式

正则表达式的作用是高效的匹配字符串。学习完正则表达式之后,涉及到字符串的操作第一时间要想到正则表达式。

1.优势

let a = "456xz789jl12"; //需要得到["456","789","12"]
console.log(fn(a));
//正则方式
function fn(str){
    return str.match(/\d+/g);
}
/*
//普通方式
function fn(str){
    let len = str.length;
    let s = "";
    let arr = [];
    for(let i=0;i<len;i++){
        let n = str.charAt(i);
        if( !isNaN(n) ){
            s += n;
        }else{
            s && arr.push(s);
            s = "";
        }
    }
    s && arr.push(s);
    return arr;
}*/

2.创建正则

  • 字面量方式

    eg:let reg = /afei/,用于匹配字符串中的 “afei” 字段。

  • 构造函数形式

    eg:let reg = new RegExp("afei"),用于匹配字符串中的 “afei” 字段。

3.正则方法

  • 正则自身的方法

    eg:reg.test(str),检测字符串str中是否包含reg规则,返回布尔值。

    eg:reg.exec(str),返回包含匹配结果的数组,没有则返回null。如果正则有 g 标志,那么继续调用reg.exec(str)时,紧接着上次的匹配位置往下匹配。

  • 字符串中能使用正则的方法

    eg:str.match(reg),返回包含匹配结果的数组,和exec类似。

    eg:str.replace(reg,str|function),将匹配的内容用第二个参数的str或者函数返回值替换,返回替换得到的新字符串。

    eg:str.split(reg),按照正则规则切割。

4.标志

可以在正则表达式后加上标志,标志分为三种:i(不区分大小写),g(全局匹配),m(换行匹配)。其中i g较为常用。

eg:let reg = /afei/i,既可以匹配字段”afei”,又可以匹配字段”AFei”。

5.转义

  • 普通意义

    \n \r \t等,用于匹配字符串中对应的转义。

  • 特殊配合

    \s \S 空格 非空格

    \d \D 数字 非数字

    \w \W 字符(数字、字母、下划线) 非字符

    \b \B 独立部分(起始位置、结束位置、以及除了\w外的) 非独立部分

  • 特殊符号转义

    比如要匹配 / 这个字符,不能直接写,需要转义,正则里面需要转义的特殊符号有:()[]{}\/^$|?*+.

    6.量词

    重复书写某个规则时可以用量词代替,比如需要重复匹配10个数字,可以由/\d\d\d\d\d\d\d\d\d\d/改为/\d{10}/的写法。

    • 量词普通写法

    {n} n个

    {n,m} n~m个,包含n也包含m

    {n,} n~无穷大个,包含n

    • 量词特殊写法

    {1,} 可由 + 代替

    {0,} 可由 * 代替

    {0,1} 可由 ? 代替

    • 贪婪与惰性

    量词默认贪婪匹配,就是说尽量往指定范围类最大的匹配,在量词后面加上 ? 符号,变为惰性匹配,也就是尽量少的去匹配。

7.子项

定义正则时,可以用()将部分规则包裹起来,这样在使用match或者exec做匹配的时候,能在得到的结果里面拿到该部分匹配的内容。

eg:"abcd12ef".match(/d(\d+)/)会得到数组["d12","12"]

同时,正则的构造函数RxgExp上,有多个$属性,也会存储上一次正则匹配对应的各个子项。

8.字符集

  • 范围

    可以使用字符集来匹配某一个范围的字符,比如:

    [2-7],匹配 2-7 之间的任一数字字符。

    [b-r],匹配 b-r 之间的任一字母字符。

    [\u4e00-\u9fa5],匹配任一汉字字符。

  • 或者

    可以使用字符集来表示或者的需求,比如:

    [abc],匹配 a或者b或者c 字符。

    [0-9a-z],匹配 数字或者小写字母 字符。

    [^abc],匹配除了 abc 三个字符之外任一字符。

大部分在外面有特殊意义的符号,在这里都没有特殊意义,不需要转义,比如:[(){}],匹配 ( 或 ) 或 { 或 } 字符。 而 - 符号在字符集里有特殊意义,所以要在字符集里面表示 – 符号需要转义。

9.其他特殊字符

  • ^ 和 $

    ^$ 分别表示匹配开始位置 和 匹配结束位置。

  • .

    . 表示匹配任意字符,即使在字符集里面,也表示匹配任意字符。

10.捕获组

正则的子项会被记录下来,可以使用捕获组来重复某个子项。

/a(\d\d)\1/,匹配类似于 “a2323” 或者 “a1919″这样的字符,但与量词不同的是,捕获组所匹配的内容和子项所匹配的内容要一样,所以这个正则不能匹配类似于 “a1223” 或者 “a4976” 这样的字符。

11.断言

/windows(?=98)/,匹配后面是字符98的 windows 字符。

/windows(?!98)/,匹配后面不是字符98的 windows 字符。

/(?<=20)19/,匹配前面是字符20的 19 字符。

/(?<!20)19/,匹配前面不是字符20的 19 字符。

断言不会算作捕获组。



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码