javascript中的正则表达式

模板网 2021-04-14

javascript正则表达式的定义

  • JavaScript中的正则表达式定义在一个RegExp对象中,通过实例化一个RegExp构造函数来创建一个正则表达式对象
    var pattern=new RegExp('s$');//该表达式可以匹配所以以字符‘s’结尾的字符串
    
  • 通常我们在使用的过程中,也可以使用一对'/'包裹的表达式来定义一个正则表达式对象
    var pattern=/s$/; //该表达式同样匹配所有已字符‘s’结尾的字符串
    
  • 需要注意的是,在ECMAScript3规范中规定,同一个正则表达式所返回的都是同一个对象,但是在ECMAScript5中同一个正则表达式每次运算返回的都是新的对象。
    function getRe(){
      var re=/[a-z]/;
      re.foo='bar';
      return re;
    }
    var reg=getRe();
    var re2=getRe();
    console.log(reg==re2);//在ECMAScript3的版本中返回的是ture,但是在ECMAScript5中返回的是false;
    reg.foo='baz';
    console.log(re2.foo);//在ECMAScript3版本中返回‘baz’,但是在ECMAScript5中返回的死bar;
    

javascript正则表达式的参数

在javascript正则表达式的构造函数RegExp()中接受两个参数,第一个参数为匹配的正则表达式(可以以字符串的形式传入,但是相应字符需要用‘\’转义),第二个参数则为正则表达式的修饰符('i','g','m')

正则表达式修饰符 修饰符含义
i 执行不区分大小写的匹配
g 执行全局匹配,匹配字符串中所有符合表达式规则的子串
m 多行匹配,^匹配一行的开头和字符串的开头,$匹配一行的结束和字符串的结束

javascript string对象使用正则匹配的方法

  • search()方法 括号参数为一个正则表达式(如果参数不是正则表达式,则会自动通过RegExp构造函数转换成正则表达式),返回匹配第一个匹配子串的起始位置(字符串首尾从0开始),如果未匹配到相应字符则返回-1,search方法忽略正则表达式中的g参数,所以不支持全局检索。
    var str='123javascript正则表达式的方法';
    console.log(str.search(/java/));//返回结果为3;
    
  • replace()方法 括号中的第一参数为匹配正则表达式,第二个参数为将要替换的字符串,返回替换后的新的字符串。
    var str='javascript正则表达式的方法'
    console.log(str.replace(/javascript/,'js'));//返回结果为'js正则表达式的方法'
    
  • match()方法 括号中的唯一参数是正则需要匹配的正则表达式,(如果参数不会正则表达式,则会自动通过RegExp构造函数转换成正则表达式),返回一个由匹配结果组成的数组。如果参数中的正则表达式设置的g参数,则返回的数组包含所有匹配的结果。
    var str='1 plus 2 equals 3';
    console.log(str.match(/\d+/g));//返回结果是["1", "2", "3"];
    
    如果参数中的正则表达式没有设置g参数,则返回的数组中,第一个元素为第一次匹配到的元素的完整结果,后面依次为正则表达式用圆括号括起来的子表达式,以及所匹配的一个元素所在位置的索引和全文文本。
    var url=/(\w+):\/\/([\w.]+)\/(\S*)/;
    var str='this is my blog website http://lilunze.github.io/index.html';
    var result=str.match(url);
    console.log(result);
    返回的结果为:
    ["http://lilunze.github.io/index.html", //第一个完整匹配的结果
    "http", //第一个圆括号内表达式匹配的结果
    "lilunze.github.io", //第二个圆括号内表达式匹配的结果
    "index.html", //第三个圆括号表达式匹配的结果
    index: 24, //第一个完整匹配结果所在文本的索引
    input: "this is my blog website http://lilunze.github.io/index.html"]//全文的文本内容
    
  • split()方法 传入一个分隔符,将调用该方法的字符串按照指定的分割符分割,并返回一个包含了所有分割后的字符串所组成的数组
    var str='123,456,789,4343434';
    console.log(str.split(','));//返回的结果为["123", "456", "789", "4343434"];
    

    javascript正则表达式的属性

    在每个正则表达式的构造函数实例化对象中都包含有四个属性('global','ignoreCase','multiline','lastIndex')
正则表达式的属性 属性的含义
global 返回一个布尔值,表示该正则表达式是否含有g参数
ignoreCase 返回一个布尔值,表示该正则表达式是否含有i参数
multiline 返回一个布尔值,表示该正则表达式是否含有m参数
lastIndex 一个可读写的整数,如果匹配模式带有g参数,该属性存储整个字符串中下次检索的开始位置
source 返回正则表达式的源文本

javascript正则表达式的方法

  • exec()方法 exec()方法与match()方法在未执行全局检索的方法类似,同一个正则表达式可以重复执行exec()方法,如果是全局检索,那么每次在执行exec()方法的时候在RegExp的lastIndex属性中会存储紧挨着匹配字符串的索引,下次在执行exec()方法的时候回从索引位置开始检索 ``` var url=/(\w+)://([\w.]+)/(\S*)/g; var str='this is my blog website http://lilunze.github.io/index.html ,and http://lilunze.github.io/index.html is a good website'; var result=url.exec(str); console.log(result); console.log(url.lastIndex); var result2=url.exec(str); console.log(result2);

运行结果为

[ "http://lilunze.github.io/index.html", "http", "lilunze.github.io", "index.html", index: 24, input: "this is my blog website http://lilunze.github.io/i…://lilunze.github.io/index.html is a good website" ]

59

[ "http://lilunze.github.io/index.html", "http", "lilunze.github.io", "index.html", index: 65, input: "this is my blog website http://lilunze.github.io/i…://lilunze.github.io/index.html is a good website" ]

100

- **test()方法**
test()方法的运行原理与exec()方法一致,接受一个字符串参数,匹配该字符串中是否有符合正则表达式规则的子串,返回一个布尔值,与exec()的null结果对应的就是false;

var url=/(\w+)://([\w.]+)/(\S*)/g; var str='this is my blog website http://lilunze.github.io/index.html ,and http://lilunze.github.io/index.html is a good website'; var result=url.test(str); console.log(result);//返回结果是true;


#### javascript正则表达式的常用语法
- 常用字符量

|常用字符量|含义|
|:--------:|:--------:|
|[...]|匹配方括号内的所有字符|
|[^...]|匹配不在方括号内的任意字符|
| \ |  转义字符|
| ^ |匹配字符串开始的位置,如果设置了m属性,也匹配 \r 和 \n 之后的位置|
| $ |匹配字符串结束的位置,如果设置了m属性,也匹配 \r 和 \n 之前的位置|
| * |匹配前面的子表达式0次或多次,例如 /o*/能够匹配h|
| + |匹配前面的子表达式1次或多次,例如 /o+/能够匹配hello,不能匹配h|
| ? |匹配前面的子表达式0次或1次,例如 /o?/能够匹配h,也能够匹配hello,当?跟在任何一个限制符后面时匹配模式是贪婪的(匹配将尽可能少的匹配字符)|
| \{n\} |匹配前面的子表达式确定的n次,例如 /o{2}/ 能够匹配food,但是不能匹配hello|
| \{n,\} |匹配前面的子表达式至少n次|
| \{n,m\} |匹配前面的子表达式至少n次且不大于m次,n<=m|
| . |匹配除 \n 之外的任何单个字符|
| `(x|y)` |匹配x或y,例如 /h|o/ 能够匹配h和o|;
| a-z |匹配字符范围内的字符,例如 /[a-z]/ 能够匹配字符a-z之间的所有小写字母|
| [^a-z] |匹配不在该范围内的所有字符|
| \b |匹配单词的边界,例如 /o\b/能够匹配hello,但是不能匹配helloa|
| \B |匹配非单词边界,例如 /o\B/能够匹配helloa,但是不能匹配hello|
| \d |匹配一个数字字符|
| \D |匹配一个非数字字符|
| \w |匹配包括下划线在内的任意单词字符,等价于[a-zA-Z0-9_]|
| \W |匹配任意非单词字符,等价于[^a-zA-Z0-9_]|
| \num |对所获取的引用的匹配,例如 /(o)\1/ 能够匹配helloo,但是不能匹配hello|
| \f |匹配换页符|
| \n |匹配一个换行符|
| \r |匹配一个换行符|
| \s |匹配一个空格符,等价于[ \f\n\r\t\v]|
| \S |匹配一个非空格符,等价于[^ \f\n\r\t\v]|
| \t |匹配制表符|
| \v |匹配垂直制表符|















相关文章

  1. 反向代理缓存

    一、传统代理 很久以前,我们通常需要通过代理服务器来访问互联网上的Web站点,代理服务器本身接入了互联网,而我们通过内部网络与代理服务器相连。即便是现在,有些时候为了访问一些由于某种原因无法直接访问

  2. 常见排序列表

    常见排序列表 中文名称 英文名称 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 选择排序 Selection n^2 n^2 n^2 1 不稳 冒泡排序 Bub

  3. 递归和分治思想

    一、斐波那契数列 1 1 2 3 5 8 13 21 34 55 89 144 ...... 我们可以用数学函数来定义: |0,当n = 0 F(n) = |1,当n = 1

  4. 如何应对缓存穿透和缓存雪崩问题

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。 缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请

  5. redis特殊功能

    一、慢查询 生命周期 两点说明: (1)、慢查询发生在第三阶段 (2)、客户端超时不一定慢查询,但慢查询是客户端超时的一个因素。 两个配置 ``` (1)、slowlog-max-len

随机推荐

  1. 反向代理缓存

    一、传统代理 很久以前,我们通常需要通过代理服务器来访问互联网上的Web站点,代理服务器本身接入了互联网,而我们通过内部网络与代理服务器相连。即便是现在,有些时候为了访问一些由于某种原因无法直接访问

  2. 常见排序列表

    常见排序列表 中文名称 英文名称 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 选择排序 Selection n^2 n^2 n^2 1 不稳 冒泡排序 Bub

  3. 递归和分治思想

    一、斐波那契数列 1 1 2 3 5 8 13 21 34 55 89 144 ...... 我们可以用数学函数来定义: |0,当n = 0 F(n) = |1,当n = 1

  4. 如何应对缓存穿透和缓存雪崩问题

    分析:这两个问题,说句实在话,一般中小型传统软件企业,很难碰到这个问题。如果有大并发的项目,流量有几百万左右。这两个问题一定要深刻考虑。 缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请

  5. redis特殊功能

    一、慢查询 生命周期 两点说明: (1)、慢查询发生在第三阶段 (2)、客户端超时不一定慢查询,但慢查询是客户端超时的一个因素。 两个配置 ``` (1)、slowlog-max-len