zoukankan      html  css  js  c++  java
  • JS正则表达式整理

    正则表达式是指按照某种规则去匹配符合条件的字符串。

    语法

    JS通过内置对象RegExp支持正则表达式。有两种方法实例化RegExp对象--字面量与构造函数。

    字面量

    语法:/正则表达式主题/修饰符(可选)

    示例:

    1     var reg = /\bis\b/g;
    2     var str = 'He is a boy.This is a boy.';
    3     console.log(str.replace(reg, 'IS'));    //'He IS a boy.This IS a boy.'

    构造函数

    语法:new RegExp('正则表达式主题','修饰符')

    示例:

    1     var reg = new RegExp('\\bis\\b', 'g');
    2     var str = 'He is a boy.This is a boy.';
    3     console.log(str.replace(reg, 'IS'));    //'He IS a boy.This IS a boy.'

    修饰符

    g : global,全文搜索。默认搜索到第一个匹配停止。

    i : ignore case,忽略大小写。默认大小写敏感。

    m : multiple lines,多行搜索。

    元字符

    正则表达式由两种基本字符类型组成:原义文本字符、元字符。

    元字符是在正则表达式中有特殊含义的非字母字符。

    * + ? $ ^ . | \ () {} []

    字符 含义
     \t  制表符
     \v  垂直制表符
     \n  换行符
     \r  回车符
     \0  空字符
     \f  换页符
     \cX  与X对应的控制字符(Ctrl + X)
     \a  alert字符
     \e  escape字符
     \b  单词边界

    字符类

    一般情况下正则表达式一个字符对应字符串一个字符

    示例:

    1     console.log(/ab/.test('abcd')); //true

    可以使用元字符[]来构建一个简单的类。所谓类是指符合某些特性的队形,是一个泛指,并不是特指某个字符。例如表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符。

    示例:

    1     console.log('a1b2c3d4ab1'.replace(/[abc]/g, 'X')); //'X1X2X3d4XX1'

    字符类取反

    使用元字符^创建反向类、负向类(不属于某类的内容)。例如[^abc]表示不是字符a或b或c的内容

    示例:

    1     console.log('a1b2c3d4ab1'.replace(/[^abc]/g, 'X')); //'aXbXcXXXabX'

    范围类

    可以使用[a-z]来连接两个字符表示从a到z的任意字符,包括a和z本身

    示例:

    1     console.log('a1b2c3d4ab1'.replace(/[a-z]/g, 'X')); //'X1X2X3X4XX1'

    在[]组成的类内部是可以连写的,如[a-zA-Z]

    示例:

    1     console.log('a1b2c3d4ab1FDSAF'.replace(/[a-zA-Z]/g, 'X')); //'X1X2X3X4XX1XXXXX'

    特殊情况:匹配范围内的-

    1     console.log('2017-11-22'.replace(/[0-9-]/g, 'A'));  //'AAAAAAAAAA'

    预定义类

    字符 等价类 含义
    . [^\r\n] 除了回车符和换行符之外的所有字符
    \d [0-9] 数字字符
    \D [^0-9] 非数字字符
    \s [\t\n\x0B\f\r] 空白符
    \S [^\t\n\x0B\f\r] 非空白符
    \w [a-zA-Z_0-9] 单词字符(字母数字下划线)
    \W [^a-zA-Z_0-9] 非单词字符

    边界

    字符 含义
    ^ 以xxx开始
    $ 以xxx结束
    \b 单词边界
    \B 非单词边界

    示例:

    1     console.log('This is a boy'.replace(/is/g, 'A'));   //'ThA A a boy'
    2     console.log('This is a boy'.replace(/\bis\b/g, 'A'));   //'This A a boy'
    3     console.log('This is a boy'.replace(/\Bis\b/g, 'A'));   //'ThA is a boy'
    1     console.log('@123@abc@'.replace(/@/g, 'Q'));    //'Q123QabcQ'
    2     //替换第一个开头的@
    3     console.log('@123@abc@'.replace(/^@/g, 'Q'));   //'Q123@abc@'
    4     //替换结尾的@
    5     console.log('@123@abc@'.replace(/@$/g, 'Q'));   //'@123@abcQ'
    1     var str = '@123\n@456\n@789';
    2     console.log(str.replace(/^@/g, 'A')); //这样做只替换了第一行的@
    3     console.log(str.replace(/^@/gm, 'A'));  //这样做会替换所有行首的@

    量词

    字符 含义
    ? 出现零次或一次(最多出现一次)
    + 出现一次或多次(最少出现一次)
    * 出现零次或多次(任意次)
    {n} 出现n次
    {n,m} 出现n到m次
    {n,} 至少出现n次

    贪婪模式

    匹配尽可能多的字符

    1     var str = '12345678';
    2     console.log(str.replace(/\d{3,6}/, 'S'));   //S78
    3     //尽可能多地匹配到数字出现的第6次

    非贪婪模式

    匹配尽可能少的字符。

    在量词后加?即可

    1     var str = '12345678';
    2     console.log(str.replace(/\d{3,6}?/, 'S'));   //S45678
    3     //尽可能少地匹配到数字出现的第3次

    所有 +? 代表匹配一次

    分组

    使用()可以达到分组的功能。

    1     var str = 'a1b2c3d4';
    2     //匹配3次 一个字母一个数字的形式
    3     console.log(str.replace(/[a-z]\d{3}/g, 'X')); //a1b2c3d4 不能匹配到
    4     console.log(str.replace(/([a-z]\d){3}/g, 'X')); //Xd4 完美匹配

    忽略分组

    不希望捕获某些分组,只需在分组内添加?:即可

    1     var str = '1017-11-27';
    2     console.log(str.replace(/(?:\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1'));  //27/$3/11

    使用 | 可以达到或的效果。

    1     //匹配byron或casper
    2     var str1 = 'byroncasper';
    3     console.log(str1.replace(/byron|casper/g, 'X')); //XX
    4 
    5     //匹配byronsper或byrcasper
    6     var str2 = 'byronsperfdsbyrcasper';
    7     console.log(str2.replace(/byr(on|ca)sper/g, 'X'));  //XfdsX

    反向引用

     使用$1~$n,得到对应分组中匹配到的字串

    1     //将2017-11-27替换成11/27/2017
    2     var str = '1017-11-27';
    3     str.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1');

    前瞻

    在正则表达式匹配到规则的时候向前检查是否符合断言。

    后顾/后瞻相反。

    JS不支持后顾

    1     //将 后面是数字的单词字符替换成'X'
    2     var str = 'a2*3';
    3     console.log(str.replace(/\w(?=\d)/g, 'X')); //'X2*3'
    4 
    5     var str = 'a2*34v8';
    6     console.log(str.replace(/\w(?=\d)/g, 'X')); //'X2*X4X8'
    1     //将 后面不是数字的单词字符替换成'X'
    2     var str = 'a2*3vv4';
    3     console.log(str.replace(/\w(?!\d)/g, 'X')); //'aX*XXvX'

     正则表达式的对象属性

    global:是否全文搜索,默认为false

    ignoreCase:是否大小写敏感,默认为false

    multiline:多行搜索,默认为false

    lastIndex:当前表达式匹配内容的最后一个字符的下一个位置

    source:正则表达式的文本字符串

     1     var reg1 = /\w/;
     2     console.log(reg1.global);   //false
     3     console.log(reg1.ignoreCase);   //false
     4     console.log(reg1.multiline);    //false
     5     console.log(reg1.source);   //'\w'
     6 
     7     var reg2 = /\w/gim;
     8     console.log(reg2.global);   //true
     9     console.log(reg2.ignoreCase);   //true
    10     console.log(reg2.multiline);    //true
    11     console.log(reg2.source);   //'\w'

    上面几个属性为只读属性。

    1     reg1.global = true;
    2     console.log(reg1.global);   //false
    3     reg1.source = '\d';
    4     console.log(reg1.source);   //'\w'

    正则表达式的方法

    test

    用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在返回true,否则返回false

    1     var reg1 = /\w/;
    2     console.log(reg1.test('$'));    //false
    3     console.log(reg1.test('a'));    //true 重复执行,结果不会变
    4 
    5     var reg2 = /\w/g;
    6     console.log(reg2.test('a'));    //true
    7     console.log(reg2.test('a'));    //false

    上述代码中reg2的test结果会交替出现,是因为在加了g修饰符的情况下,lastIndex会起作用。所以用test方法时,最好不要用g修饰符

    1     var reg2 = /\w/g;
    2     console.log(reg2.test('a'));    //true
    3     console.log(reg2.lastIndex);    //1
    4     console.log(reg2.test('a'));    //false
    5     console.log(reg2.lastIndex);    //0

    exec

    使用正则表达式对字符串执行搜索,并将更新全局RegExp对象的属性(主要是说lastIndex)以反映匹配结果。如果没有匹配的文本返回null,否则返回一个结果数组。

    非全局

    1     var reg = /\d(\w)\d/;
    2     var str = '1a2b3c';
    3     console.log(reg.exec(str)); //["1a2", "a", index: 0, input: "1a2b3c"]

    其中index表示匹配文本的第一个字符的位置

    input存放被检索的字符串string

    第0个元素是与正则表达式相匹配的文本

    第1个元素是与正则表达式对象的第一个子表达式相匹配的文本(如果有的话,也就是分组文本)

    第2个元素是与正则表达式对象的第二个子表达式相匹配的文本(如果有的话),依次类推

    全局

    1     var reg = /\d(\w)\d/g;
    2     var str = '1a2b3c4d5e';
    3     console.log(reg.exec(str)); //["1a2", "a", index: 0, input: "1a2b3c4d5e"]
    4     console.log(reg.exec(str)); //["3c4", "c", index: 4, input: "1a2b3c4d5e"]
    5     console.log(reg.exec(str)); //null
    6     console.log(reg.exec(str)); //["1a2", "a", index: 0, input: "1a2b3c4d5e"]

    与正则表达式相关的字符串对象方法

    search

    用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。方法返回第一个匹配结果的index,查找不到返回-1

    search()方法不支持全局匹配,会忽略标志g,并且总是从字符串的开始进行检索。

    1     console.log('a2b1c3d1'.search('1'));    //3
    2     console.log('a2b1c3d1'.search(1));    //3
    3     console.log('a2b1c3d1'.search(/1/));    //3
    4     console.log('a2b1c3d1'.search(/1/g));    //3
    5     console.log('a2b1c3d1'.search(/1/g));    //3

    match

    在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

    如果没有找到任何匹配的子串,则返回null。如果找到了一个或多个匹配子串,则返回一个数组。

    非全局匹配

    如果正则表达式为非全局匹配,match方法就只能在字符串对象中执行一次匹配。

    1     var str = 'a1b2c3d4e5';
    2     var reg = /\d(\w)\d/;
    3     console.log(str.match(reg)); //["1b2", "b", index: 1, input: "a1b2c3d4e5"]
    4     console.log(reg.exec(str)); //["1b2", "b", index: 1, input: "a1b2c3d4e5"]

    非全局匹配时与正则表达式的exec方法返回结果相同

    全局匹配

    进行全局检索,找到字符串对象中的所有匹配子字符串。数组元素中存放的是字符串对象的所有匹配子串,没有index或input属性。

    1     var str = 'a1b2c3d4e5';
    2     var reg = /\d(\w)\d/g;
    3     var ret = str.match(reg);
    4     console.log(str.match(reg)); //["1b2", "3d4"]
    5     console.log(ret.index); //undefined
    6     console.log(ret.input);//undefined

    split

    用于把一个字符串分割成字符串数组。

        console.log('a,b,c,d'.split(','));  //["a", "b", "c", "d"]

    使用正则表达式的情况:

        console.log('a1b2c3d4e5f'.split(/\d/)); //["a", "b", "c", "d", "e", "f"]

    replace

    语法:

      String.prototype.replace(str, replaceStr)

      String.prototype.replace(reg, replaceStr)

      String.prototype.replace(reg, function)

    前面两种语法,之前的例子有涉及到。重点看一下最后一个语法。

    不会改变原字符串。返回一个替换后的新字符串。

    function会在每次匹配替换的时候调用,有四个参数:

      1、匹配到的子字符串

      2、正则表达式分组内容,没有分组则没有该参数

      3、匹配项在字符串中的index

      4、原字符串

    1     //将a1b2c3替换为a2b3c4
    2     var str = 'a1b2c3';
    3     console.log(str.replace(/\d/g, function (match) {
    4         return parseInt(match) + 1;
    5     }));       //'a2b3c4'   
    1     //将a1b2c3d4e中的b和d去掉
    2     //b和d为两个数字中间的字符
    3     console.log('a1b2c3d4e'.replace(/(\d)(\w)(\d)/g, function (match, group1, group2, group3) {
    4         return group1 + group3;
    5     }));    //a12c34e
  • 相关阅读:
    Symbian点滴3对象的创建和释放以及对象的二阶段构造
    SQL 列转行
    HashMap详解
    SpringCloudEureka工作原理及和ZooKeeper的区别
    Redis如何使redis中存放数据都为热点数据,缓存算法,key的淘汰策略
    线程的三种实现方式详解
    Redis缓存雪崩,缓存穿透,缓存击穿,缓存预热概念及解决方案
    mysql系列——连接查询(七)
    SpringCloud服务雪崩,降级 ,熔断
    hdu 2215 Maple trees
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/7880416.html
Copyright © 2011-2022 走看看