JS 正则表达式

2020-10-03  本文已影响0人  弱冠而不立

推荐一篇好文章:JS正则表达式完整教程(略长)

正则表达式概述

概念:按照一定的规则,查找和替换字符串
执行原理:通过 [参数字符串] 设置检索规则,在 [指定字符串] 中检索符合规则的字符串
作用:用来进行文本搜索和文本替换

正则表达式的基本语法

语法:/正则表达式/修饰符(可选)
例:let abc_reg = /abc/gi ==> ABC aBc abC...
其中:

正则表达式的常见用法

  1. search 方法
    用于检索与正则表达式相匹配的子字符串,并返回子字符串的起始位置。
  2. match 方法
    用于检索与正则表达式相匹配的子字符串,并返回一个或者多个的正则匹配。
  3. replace 方法
    用于在指定字符串中,用一个字符串替换一个与正则表达式相匹配的子字符串。

正则表达式进阶

1. 修饰符

修饰符是正则表达式进行字符串检索时 [检索规则] 的制定者之一。即:修饰符规定了正则应该按照何种方式进行检索。常见的修饰符类型有两种:i, g

2. 检索模式

用于指定正则采用何种方式进行内容的检索,它们不互相独立,而是相辅相成,就像修饰符可以多个一起使用一样。

1. 表达式模式

常见的表达式模式有以下三种:

        let str  = "123abc1|||k23ABC;"
        console.log(str.match(/[abc]/gi));
        console.log(str.replace(/[abc]/gi,"(R)"));
只要存在于[]之间的都会被查找出和替换
        let str  = "123abc1|||k23ABC;"
        console.log(str.match(/[0-2]/gi));
        console.log(str.replace(/[a-zA-Z]/gi,"(R)"));
0-2之间的数字都被找出,a-zA-Z的字符都被替换
        let str  = "123abc1|||k23ABC;"
        console.log(str.match(/(123|abc)/gi));
        console.log(str.replace(/(123|abc)/gi,"(R)"));
123 和 abc 不区分大小写被整段找出和替换
2. 元字符模式

具有特殊含义的字符称为元字符。
常见的元字符有以下几种:

        let str = "abc123 _|[]MABC*dad 123lda123abc";
        console.log(str.match(/\w/g));
        console.log(str.match(/\W/g));
        console.log(str.match(/[a-z]\w/g));
        console.log(str.match(/[a-z]\W/g));
\w 将所有数字字母下划线都找出,\W 将所有非数字字母下划线找出,[a-z]\w 将第一个是a-z 第二个是数字字母或下划线的字符串找出,[a-z]\W 将第一个是a-z 第二个是非数字字母或下划线的字符串找出
        let str = "abc123 _|[]MABC*dad 123lda123abc";
        console.log(str.match(/\d/g));
        console.log(str.match(/\D/g));
        console.log(str.match(/[a-z]\d/g));
        console.log(str.match(/[a-z]\D/g));
\d 匹配所有数字,\D 匹配所有非数字,[a-z]\d 匹配第一个字符是a-z的字母 第二个字符是数字的字符串,[a-z]\D 匹配的是第一个字符是a-z的字母 第二个字符是非数字的字符串
        let str = "abc123 _|[]MABC*dad 123lda123abc";
        console.log(str.match(/\s/g));
        console.log(str.match(/\S/g));
        console.log(str.match(/[a-z]\s/g));
        console.log(str.match(/[a-z]\S/g));
\s 匹配所有空白字符,\S 匹配所有非空白字符,[a-z]\s 匹配第一个字符是a-z的字母 第二个字符是空白字符的字符串,[a-z]\S 匹配的是第一个字符是a-z的字母 第二个字符是非空白字符的字符串

即:隐藏的位置 \b 匹配的是上一个显示位置 和 下一个显示位置的字符不全是 \w(单词)
例如:

        let str = "hello world";
        console.log(str.replace(/\b/g,"#"));
        console.log(str.replace(/\B/g,"#"));
符合条件的隐式位置被替换成了 # ,使用 \B 则完全相反

再看一个例子:

        let str = "abc123 _|[]MABC*dad 123abc*123abc";
        console.log(str);
        console.log(str.replace(/\babc/ig,"(R)"));
        console.log(str.replace(/abc\b/ig,"(R)"));
        console.log(str.replace(/[0-9]\b/ig,"(R)"));
        console.log(str.replace(/\b[0-9]/ig,"(R)"));
可以这样理解,\b 在 abc 和 [0-9] 之前,即找出在abc 和 [0-9] 之前的那么一个隐式位置,然后将后面的 abc 或 [0-9] 替换。\b 在之后也是同理
3. 量词模式

表示要检索的字符或字符串出现的次数的词组称为量词。
如果用 n 表示要检索的字符或者字符串,那么常见的量词模式有:

        let str = "abcccc123 _|[]MABC*dad 123ab*123abc";
        console.log(str);
        console.log(str.match(/abc+/ig));
        console.log(str.match(/abc*/ig));
        console.log(str.match(/abc?/ig));
+ 号 表示至少有一个 c , * 号 表示 0 个或者多个, ? 号 表示 0 个或者 1 个
4. RegExp 对象

上面提到正则表达式的基本语法是 /正则表达式/修饰符(可选),这种创建正则的方法我们称为 [字面量创建正则表达式]。实际上 JS 也为正则提供了一个构造函数 RegExp,我们可以通过这个构造函数来生成一个正则表达式实例,这种创建正则的方式我们称为 [构造函数创建正则表达式]。
语法:let regExp = new RegExp("正则表达式", "修饰符")

注:通过构造函数方式创建的正则,参数均采用字符串声明

        let str = "ab123ABCccdawdab32";
        let regExp = new RegExp("abc?","gi");
        console.log(regExp.test(str));
        console.log(regExp.exec(str));

正则表达式高级

1. 检索模式的 ^ 和 $ 字符

        let str = "abcn123dabc.com";
        console.log(str.replace(/^abc/g,"(R)"));
        console.log(str.replace(/.com$/g,"(R)"));
        console.log(str.replace(/(^abc)|(.com$)/g,"(R)"));

2. 重复类

重复类就类似与上面说的量词,用 { } 进行检索的一种模式称谓,{ } 用来匹配符合正则要求的字符连续出现的次数。

subStr{n}: 想要检索的内容出现了恰好 n 次
subStr{n,}: 想要检索的内容至少出现了 n 次,类似上面量词的 n+
subStr{m,n}: 想要检索的内容至少出现了 m 次,至多出现了 n 次

即:{0,1} 等价于 ? ; {1, } 等价于 + ; {0, } 等价于 *

3. 贪婪模式 和 懒惰模式

它们并不属于之前任何一种检索模式,但是它们是在此之上隐形产生的,例如

n* 就是贪婪模式, 只要符合正则要求就一直往下匹配
n? 就是懒惰模式,只要一匹配到符合正则的要求就立即结束

常见的懒惰模式:+ * {n} {n,} {n,m}
常见的贪婪模式:+? *? {n}? {n,}? {n,m}?

4. 脱字符 [^]

脱字符用在正则表达式的中括号里,表示匹配除了中括号里的。当前仅当 ^ 出现在中括号首位时,我们称 ^ 为脱字符

例:

        let str = "ab()c123abc";
        console.log(str.replace(/[^abc]/g,"(R)"));
        console.log(str.replace(/[^(abc)]/g,"(R)"));
上一篇 下一篇

猜你喜欢

热点阅读