在前端开发中,正则表达式是一大利器。所以我们这次就来讨论下match()方法。

match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是

match([string] | [RegExp])

它的参数既可以是一个字符串,也可以是一个正则表达式。该方法绝大多数都是要使用正则表达式的,所以参数为string的情况不在本文讨论范围之内。其实参数即使是一个简单的string,其返回值也跟使用正则表达式的结果无异,而且使用正则表达式的变化比较多,用法复杂,所以我们只讨论正则的用法。

一、返回值问题。

我们必须明确的是,这个方法跟其他语言是不同的。JavaScript中的match()方法的返回值是数组或者是null。如果原字符串中匹配到了正则表达式指代的子串,则返回一个数组,否则返回null。

二、不使用全局匹配

var str = 'Today is the 186th day of 2018,I must finish these 2 projects within 21 days.';var results = str.match(/\d+/); //只能匹配字符串中出现的首个数字,未使用全局匹配符g

console.log(results);

输出的结果是:

再强调一次,这个例子的结果是没有使用全局匹配的正则表达式的匹配结果。说白了,就是正则表达式的末尾没跟g。由于不适用全局匹配,所以match()方法只找到源字符串中首次匹配的子串后,就立刻得到返回结果,不再比较之后剩余的部分是否还有能匹配上的内容。

我们可以看到,match()的结果是一个数组,该数组一共有4项。各项代表的意思如下:

第0项:匹配到字符串

第1项:groups:undefined,这表示当前的正则表达式没使用分组

第2项:index表示首次匹配上的子串的起始下标。

第3项:input,表示源字符串

第4项:length,表示匹配到的结果个数,由于这里不使用全局匹配,只找到首次匹配项就结束了,所以匹配结果只有1个,length也就是1。

再次强调下,如果在正则表达式末尾不使用全局匹配符g,在本例中是无法匹配到所有的数字。反过来说就是,如果想匹配所有的符合条件的子串,就必须在正则的末尾添加全局匹配符g

三、使用全局匹配

var str = 'Today is the 186th day of 2018,I must finish these 2 projects within 21 days.';var results = str.match(/\d+/g); //匹配所有的数字,使用了全局匹配符g

console.log(results);

这次我们在正则表达式的末尾添加了 g,该正则表达式的意图是,在字符串str中匹配出所有的由数字组成的子符串。

这次结果如下:

可以看到,这次的返回值仍然是个数组,只不过这个数组的内容跟上边不使用全局匹配时大不相同的。由于原字符串中出现了4个数字组成的子串的情况,所以该数组中出现了4个项。length属性同样为匹配到的结果个数,这里显然是4个。

仔细看会发现,此时返回的数组中,没有index,input这2项,不过这两项并不十分重要。

四、使用分组

使用分组时的情况比较麻烦,还要看有没有使用全局匹配,也就是有没有在正则表达式的末尾添加g

4.1 使用分组,且不使用g

var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';var results = str.match(/\d+(th)/); //匹配str中首个以数字开头,并且以th结尾的子串

console.log(results);

输出结果是:

由于该正则表达式为: /\d (th) /,该表达式中使用了小括号(),在此处的作用为分组。所以match()的结果是带有分组特征的。返回的数组包含多个元素,第一个元素是以贪婪模式找到的最长的匹配,之后的元素依次为该匹配中的第一、第二、第三 ......个分组,这里只有1个分组,所以也就只匹配到1个分组结果,也就是”th"。

假如正则表达式改成:/\d+(t)(h)/,那么匹配到的项就有3个,分别是 : '286th' 、 't' 、'h'。我相信大家看到这里,对于分组的意义,以及如何匹配分组就已经了解了。

数组中其它项不在解释了,参考上边的。

需要注意的是,这种结果是前提是:1.使用分组,2.不做全局匹配。

4.2 使用分组,同时使用全局匹配g

var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';var results = str.match(/\d+(th)/g); //匹配str中所有的以数字开头,并且以th结尾的子串

console.log(results);

这次的代码,跟上次的代码区别只有一点,就是正则表达式末尾多了个g,表示全局匹配。

结果也是大不相同的。

结果说明了一切,当正则中使用全局匹配符g,即使有分组的存在,在匹配结果中也只有匹配到的最长的,那些分组的子匹配都不见了。

具体表现为:这次匹配到的结果是 ’286th‘ 和 ‘’108th’ ,前一个例子中使用分组是出线的那个单独的分组子匹配  ‘th’,这一项不见了。我们把这个现象理解为,只要使用了全局匹配模式,那么match()将只返回“贪婪”的匹配结果,这里的“贪婪”指的就是只招那个最长的能匹配上的字符串,至于分组项,就忽略了。

java 正则表达式match_详解正则表达式匹配方法 match()相关推荐

  1. php正则表达式实例详解,正则表达式实例解析

    正则表达式实例解析 类别: 技术 时间:2016-06-02 10:14:14 字数:6253 版权所有,未经允许,请勿转载,谢谢合作~ ### 前言 正则表达式(regular expression ...

  2. java matcher.group_详解正则表达式Matcher类中group方法

    前言 同事把一个excel表给我,里面的数据大概有几千的样子吧.自己需要把里面的数据一个一个拿出来做一个http请求,对得到的结果进行过滤,然后再写到上面去.这是就涉及到用脚本来进行操作了,于是自己搞 ...

  3. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  4. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  5. php 字符流在linux,PHP_linux正则表达式awk详解,awk和sed一样是流式编辑器,它 - phpStudy...

    linux正则表达式awk详解 awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用 ...

  6. linux隔行打印文本,详解正则表达式及Linux三大文本处理工具

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了. 一.正则表达式 1.匹配字符的类型 [ ...

  7. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  8. php正则如何使用 1,PHP正则表达式使用详解(1)

    PHP正则表达式使用详解(1) 一个正则表达式是一个特定的格式化模式,可以用来找出一个字符串在另一个字符串中的使用情况.几个编程语言,包括Visual Basic,Perl,JavaScript和PH ...

  9. python re库 详解(正则表达式)

    python re库 详解(正则表达式) 说明 则表达式(英文名称:regular expression,regex,RE)是用来简洁表达一组字符串特征的表达式.最主要应用在字符串匹配中. 1).re ...

  10. php 正则表达式 环视,php正则表达式环视详解

    php正则表达式环视详解 1. 顺序肯定环视(?=exp) 零宽度正预测先行断言,又称顺序肯定环视,断言自身出现位置的后面能匹配表达式exp. 比如,匹配以"ing"结尾的单词前面 ...

最新文章

  1. JDK 11版本时间表
  2. C#中获取当前应用程序的路径及环境变量
  3. 2018批量打印开关_新品上市,震撼来袭!买UV平板打印机,一定看过这款后再定!...
  4. 导致SEO优化排名不理想的三大因素,你踩雷了没?
  5. SQL Server 学习笔记
  6. 自信息跟信息熵的区别
  7. WPF 重要新概念读书笔记(转)
  8. 这些面试中经常被问到的线程池问题,你都能回答的上来吗?
  9. wp-autoblog_AutoBlog简介
  10. app测试比相比web测试需要注意的点
  11. java 标准偏差_Java Streams-标准偏差
  12. mkv视频文件损坏如何修复?很简单方法
  13. iPhone4 iOS 4.3.3 越狱之后必装的插件
  14. 护理管理学选择题汇总(人卫第三版)
  15. echarts设置标题样式,echarts设置主标题和副标题样式
  16. Python之CSV文件操作
  17. 使用kprobe监控linux内核提权(cred方法)
  18. 富途php面试经验,忍不住想吐槽一下富途二面体验
  19. (二)CT医学影像的窗高窗位、CT值(Hu值)
  20. AutoJS4.1.0实战教程 ---火火视频极速版

热门文章

  1. 牛客网项目——项目开发(三):开发登录模块
  2. oppoA37m rom固件刷机包下载 免费下载 解锁专用
  3. Equalizer 分布式渲染 在一同一台电脑启动多窗口
  4. 机器学习-累计分布函数(CDF)
  5. LM358恒流恒压原理
  6. LM393实现简易PWM调压电路
  7. arduinouno摄像头OV7670_Arduino极限操作 摄像头OV7670拍照
  8. 怎么把动态ip改成静态ip?
  9. redis 集群 set key报错CLUSTERDOWN Hash slot not served
  10. P3174 [HAOI2009] 毛毛虫(树形DP)