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()将只返回“贪婪”的匹配结果,这里的“贪婪”指的就是只招那个最长的能匹配上的字符串,至于分组项,就忽略了。

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

  1. 匹配正则_Day233:正则表达式匹配方法 match()

    match()语法 match本身是JavaScript语言中字符串对象的一个方法,该方法的签名是 match([string] | [RegExp]) 它的参数既可以是一个字符串,也可以是一个正则表 ...

  2. 详解正则表达式匹配一个反斜杠\的问题

    $str = '\/div'; $pattern = '/\\\\\/div/'; // '\\\\\/' 解析过程如下: // PHP解析: // 第1个'\'转义第2个'\',转义后为字符串'\' ...

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

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

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

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

  5. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  6. linux中date使用方法,linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)...

    linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例) 发布于 2016-02-07 15:58:40 | 108 次阅读 | 评论: 0 | 来源: 网友投递 LinuxLinux是一 ...

  7. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

  8. csrf漏洞防御方案_CSRF 漏洞原理详解及防御方法

    跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻击 ...

  9. python正则匹配ip地址_IP地址正则表达式匹配方法,ip正则表达式匹配

    IP地址正则表达式匹配方法,ip正则表达式匹配 正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述 ...

最新文章

  1. 他们让50吨大铁块变身充电电池,效率高达80%、功率250kW,网友说:逗我呢?
  2. 【Go语言】使用 http 库进行简单的接口测试
  3. Scala赋值运算符分类
  4. Winodws Socket I/O模型的整理
  5. 如何正确创建DLL和使用DLL
  6. NOIP2000提高组复赛C 单词接龙
  7. 字节序转换 oracle,Oracle10g同字节序跨平台迁移
  8. linux内核实验教程答案,20199310《Linux内核原理与分析》第十五周作业 Linux安全实验...
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线学习系统
  10. 补天五星计划范围更新,还有单个漏洞额外10000元现金奖励?!
  11. 小程序和vue语法对比_商城小程序对比传统电商的优势如何?
  12. 性能报告之路由器性能benchmark评估
  13. 基于用户行为分析建立用户偏好模型
  14. 木讷的程序员需要知道的事情 (二)
  15. 京东平台开发者入驻指南
  16. 【rmzt:杀个浠巴烂win7主题】
  17. 服装行业如何用手持PDA盘点?
  18. 2020杭电网安考研复试题+经验
  19. datastage笔记
  20. 老照片怎么修复清晰?轻松几步让图片焕发新生

热门文章

  1. Java怎么xml拒绝,Sun Java运行时环境XML解析拒绝服务漏洞
  2. markdown editor_基于 Vue+Vditor 所见即所得Markdown编辑器
  3. android setlatesteventinfo 找不到,安卓通知的基本用法
  4. 世界公认最好的记忆方法_世界记忆大师:6种简单实用记忆方法,让孩子成为学霸中学霸...
  5. 【数据库】索引优化策略
  6. java打印变量类型,冲刺7天拿下Offer!
  7. 【深度学习】生动分析半监督学习与负相关学习算法
  8. python【蓝桥杯vip练习题库】ADV-281特等奖学金
  9. 解决Tensorflow 使用时cpu编译不支持警告
  10. python 密度 语音_Python+sklearn机器学习应该了解的33个基本概念