JavaScript || 正则表达式

1 为何要用正则表达式?

进修之前,多想想为何要运用正则表达式,有助于明白。

正则表达式regular expression运用单个字符串来形貌某个句法划定规矩,计算机依据划定规矩去婚配字符串中的内容。

  • 正则表达式的机能高于通例字符串操纵(省略轮回、遍历等操纵)

  • 正则表达式仅用于字符串的操纵

2 通例字符串操纵与正则表达式的比较

要提掏出字符串中'ashx521dasbx34sasdz275dasdzxd897'中一连的数字,并将效果保留在数组中['521', '34', '275', '897']

  1. 传统字符串操纵:须要遍历全部字符串,推断每一个字符是不是在'0'-'9'之间再举行响应的操纵

    /**
     * 运用一个临时变量tmp保留一连为数值时的字符串,间断后再一致到场数组内;
     * 能够会涌现末了一名是数字的状况,所以运用i<=str.length多走一次轮回的else途径,将末了一组数组到场数组
     * 
     */
    function findNum_two(str) {
        var arr = [];
        var tmp = '';
        // 遍历字符串,掏出须要的数字
        for(var i=0; i<=str.length; i++) {   
            if(str.charAt(i) <= '9' && str.charAt(i) >= '0') {
                tmp += str[i];
            } else {
                if(tmp) {   // 假如tmp不为空
                    arr.push(tmp);
                    tmp = '';
                }
            }
        }
    
        return arr;
    }
    console.log(findNum_two(str));    //  [ '521', '34', '275', '897' ]
  2. 运用正则表达式:只需运用字符串的match()要领去婚配指定的划定规矩(正则表达式即可)

    function findNum (str) {
        return str.match(/\d+/g);
    }
    
    console.log(findNum(str));   // [ '521', '34', '275', '897' ]

3 正则表达式写法

  1. 字面量写法:var re = /\d+/gi;

  2. 组织函数写法:var re = new RegExp('\\d+', 'gi');注重两个\\,由于JavaScript中\须要转义

《JavaScript || 正则表达式》

3.1 正则表达式中的转义字符

转义字符:零丁运用字母自身有意义;在前面加上\后转变原有意义

《JavaScript || 正则表达式》

3.2 量词

用来形貌相邻的前面的单个字符婚配划定规矩涌现的次数

  • 量词运用{a, b}示意,个中b能够省略,意义差别

《JavaScript || 正则表达式》

3.3 字符类

  • 运用[]形貌一类字符,团体只代表一个字符,示意该字符在某个局限内。

  • /a[0-9]c/婚配三位字符串,第一名是a,第三位是c,第二位是'0'-'9'之间的任何一名都能够婚配胜利

  • []多种划定规矩是或 |的关联:[0-9a-zA-Z]

全部字符类[0-9a-zA-Z]只代表一名字符

注重,字符类中的^示意非的意义,不在某个局限内[^\d]示意非数字的字符

3.4 修饰符

  1. gglobal:全局婚配,找到一切的婚配项,不是在第一个婚配后住手

  2. iignored:疏忽大小写

  3. m:多行,将最先字符^和完毕字符$视为在多行上事情(每婚配一行的最先和完毕以\n\r支解)

  4. u:将形式视为Unicode序列点的序列

3.5 婚配子项

关于庞杂的正则表达式,能够运用()将其拆分为多个部份,replace(re, fn)回调函数中能够简化婚配内容的操纵

var re = /(\d+)(\w)(\S)/;

fn($0, $1, $2 ...)

  • $0代表正则表达式自身婚配到的内容:(\d+)(\w)(\S)

  • $1代表正则表达式的第一个婚配子项:(\d+)

  • $2代表正则表达式第二个婚配子项:(\w)

3.6 反复子项

重要用于婚配字符串中反复的字符

  • var re = /(a)(b)(c)\1/;\1示意反复的第一个子项(b),第4个位置的字符与第1个位置的字符雷同

  • var re = /(a)(b)(c)\2/;\2示意反复的第二个子项(b),第4个位置的字符与第2个位置的字符雷同

  • var re = /(a)(b)(c)\3/;\3示意反复的第三个子项(c),第4个位置的字符与第3个位置的字符雷同

3.7 逻辑或|

  • 运用|代表逻辑或,|摆布两个操纵数只要有一个满足要求即可

3.8 最先、完毕标记

  • 不在[]中运用^^示意以近来的婚配字符划定规矩最先全部婚配;

  • $示意以近来的婚配划定规矩完毕婚配

作用局限只是^以后的第一个子项;$前的第一个子项

4 正则表达式的要领

重要有4中要领用于操纵正则表达式:

  1. match()replace()search()是字符串的操纵要领

  2. test()exec()是正则表达式对象的操纵要领

4.1 test()

依据RegExp去婚配字符串,假如婚配胜利,返回true;婚配失利返回false重要用于逻辑推断

var str = "abxe2312dafxz";
var re = /\d+/;

re.test(str);   // true

4.2 search()

依据RegExp去婚配字符串,返回第一个婚配胜利字符串的首字符的索引;婚配失利返回-1用于查找字符的索引,相似字符串的indexOf()要领

  • str.search(re)

4.3 match()

依据RegExp去婚配字符串,假如婚配胜利,将婚配的效果保留在数组中返回;婚配失利返回null默许第一次婚配后便住手继承婚配,运用修饰符g举行全局婚配

  • str.match(re)

4.4 replace(re, newstr)要领

依据RegExp去婚配字符串,假如婚配胜利,将婚配的字符串更换为新的字符串newstr

replace()要领的参数re正则表达式是变量,必需运用new RegExp()体式格局建立re

var str = 'a23gb';
var re = /\d+/;

str.replace(re, "xy");   //  'axygb'

replace()要领的第二个参数能够是回调函数,其参数是每次婚配胜利猎取的字符串。每次婚配胜利都邑实行一次回调函数

5 实践

5.1 找到一个字符串中涌现次数最多的字符及其涌现的次数

var str = '1231asdaegj71836178asdhasssasalsdhdzxbczaslazxcnnffajshdhgagsgdssssasdzzxda';

var str = str.split('').sort().join('');   // 按递次的字符序列

var re = /(\w)\1+/g;

var length = 0;
var val = '';   // 保留涌现次数最多的字符

// $0代表每次婚配到的字符,$1代表第一个正则表达式子项(\w)
str.replace(re, function ($0, $1) {  // 能够将婚配的字符当作变量操纵
    if($0.length > length) {
        length = $0.length;
        val = $1;    // $1代表每次婚配的字符
    }
});
console.log(length);
console.log(val);

5.2 去掉字符串前后的空格

  • var re = /^\s+|\s+$/g;,运用字符串运用正则即可:str.replace(re, '')

5.3 经常使用正则婚配划定规矩

  1. QQ号:var re = /^[1-9]\d{4,11}$/; :第一名是1-9中的数字,末了也是数字,统共5-12位

  2. 中文婚配:var re = /[\u4e00-\u9fa5]/;:运用Unicode编码举行婚配

  3. emailvar re = /\w+@[a-z0-9]+(\.[a-z]+){1,3}/;:能够涌现.com.cn.net

  4. 身份证:var re = /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/i;

  5. 邮编:var re = /[1-9]\d{5}/;

5.3 将经常使用正则表达式封装在一个对象中便于运用

var re = {
    email: /\w+@[a-z0-9]+(\.[a-z]+){1,3}/,
    chinese: /[\u4e00-\u9fa5]/,
    qq: /^[1-9]\d{4,11}$/,
    id: /[1-9]\d{14}|[1-9]\d{17}|[1-9]\d{16}x/i,
    trim: /^\s+|\s+$/
}
    原文作者:Kyxy
    原文地址: https://segmentfault.com/a/1190000008729041
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞