Javascript系统复习:Javascript中的正则表达式

Posted by mieruko on 2016-09-02

前言:

正则表达式用来匹配字符,它并不依附于某种特殊的语言而存在,它是一个独立的东西。
但是正因为非常有用,许多语言都提供了对它的支持,包括javascript。
官方的定义是:

在常见的字符串检索或替换中,我们需要提供一种模式来表示检索或替换的规则。正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串。

在javascript中使用正则

正则表达式对象的创建

🌰:

1
2
3
/\d\d\d/.test("123"); // true
/\d\d\d/.test("abc"); // false
new RegExp("wanzi").test("hi wanzi"); // true

像两个斜杠中间直接写的,这是正则表达式的字面量,这是比较简单的一种创建方式。
当然我们还可以显式使用构造函数来创建,它和字面量是等价的~~

正则表达式基础

正则表达式的匹配规则,其实网上还是有蛮多专门讲这个的文章的,这里我们用一张图来覆盖一下比较基本的知识点:

表示字符匹配的符号:

正则表达式基础

表示范围的符号:

正则表达式表示范围的符号

正则表达式分组匹配:

通过分组,我们可以把每一组单独记录起来,然后可以针对这个分组进行操作~~
反斜杠后面跟的数字是这个分组对应的组序号^_^,这种写法是对已经匹配过的分组的一个引用。

正则表达式的分组

正则表达式中的重复

贪婪算法就是匹配尽可能多的,非贪婪算法就是匹配尽可能少的~~~

正则表达式中的重复

正则表达式特殊字符的转义

看这样一个🌰:

1
/\^abc/.test("^abc");  //true

从test中参数,很明显我们可以看出目的在于匹配一个以^开头的字符串。但是我们刚刚才看到^本身是正则表达式的一个特殊字符,它用来表示行首。为了让它变成一般字符,就是可以匹配它自己的一般字符,我们需要给它加上反斜杠转义~~~

正则中的三个flag

正则中的三个标志位即:

  • g:global (匹配所有的情况 默认匹配一个就结束)
  • i:ignoreCase (不区分大小写 默认区分大小写)
  • m:multiline (在有换行的时候自动换行检索)

🌰:

1
/abc/gim.test("ABC"); //true

写成构造函数形式就是:

1
new RegExp("abc","mgi");

注意顺序是无所谓的~~~

RegExp对象属性

常见的几个属性是:

1
/abc/g.global; //true

输出是否全局

1
/abc/g.ignoreCase; //false

输出是否忽略大小写

1
/abc/g.multiline; //fa;se

输出是否换行

1
/abc/g.source; //"abc"

输出源字符串

RegExp对象方法

常用的几个方法是:

  • compile (改变正则的一些属性 比如改变它的内容)
  • exec (返回匹配的结果)
  • test (返回匹配没匹配到)
  • toString (返回整个正则的内容)

    🌰:

    1
    2
    3
    4
    5
    6
    7
     /abc/.exec("abcdef"); //"abc"
    /abc/.test("abcde"); //true
    /abc/.toString(); // "/abc/"

    var reg = /abc/;
    reg.compile("def");
    reg.test("def");//true

String类型与正则相关的方法

在String类型中,是存在一些可以以正则表达式为参数的方法的。
比如:

  • String.prototype.search 返回匹配到的第一个索引
  • String.prototype.replace 返回替换的结果
  • String.prototype.match 返回匹配的结果
  • String.prototype.split 返回切割的结果

🌰:

1
2
3
4
5
"abcabcdef".search(/(abc)\1/); //0
"aabbbbcc".replace(/b+?/, "1"); //aa1bbbcc
"aabbbbcc".match(/b+/); //["bbbb"]
"aabbbbccbbaa".match(/b+/g);//["bbbb", "bb"];
"aabbbbccbbaa".split(/b+/); //["aa","cc","aa"]

总结

正则表达式博大精深!
正则的复杂的细节情况,一篇博客绝对写不完。
这里推荐《精通正则表达式》这本书^_^
或者查询更多的资料,进行更深入的学习。