美文网首页
为何 '北京空气质量'.match(/(.*?)

为何 '北京空气质量'.match(/(.*?)

作者: 勿以浮沙筑高台 | 来源:发表于2017-04-04 18:59 被阅读13次

'北京空气质量'.match(/(.*?)空气/) 返回 ['北京空气'] 大部分人应该都知道,语句最后的下标 [1],可能会让不少人犯迷糊。
先来看看这条语句中涉及到的几个关键词:RegExp.*?(exp)match();

  • RegExp:正则表达式,又称规则表达式,常被用来检索、替换那些符合某个模式(规则)的文本。
  • .:匹配除换行符以外的任意字符。
  • *:正则表达式中的限定符,用于指定数量。
  • ?:正则表达式中的限定符,重复零次或一次。当*?一起使用即 *? ,表示重复任意次,但尽可能少重复(懒惰模式)。
  • stringObject.match(regexp):match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。
  • (exp):匹配这个子表达式 exp 的文本,并捕获文本到自动命名的组里。返回存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g
    • 如果 regexp 没有标志 g , 只在 stringObject 中执行一次匹配。如果没有找到匹配的文本将返回 null。否则,返回一个数组。该数组的第0个元素存放匹配的文本,其余的元素存放与正则表达式的子表达式匹配的文本。该数组还有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。
  • 如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject中所有的匹配子串,而且也没有 index 属性或input 属性。

正则表达式 /(.*?)空气/ 表示以任意个任意字符开始以 空气 结束的字符段。
根据上面的解释,'北京空气质量'.match(/(.*?)空气/)中的 regexp 表达式没有标志 g,如果找到匹配的文本将返回一个数组,该数组的非第0个元素存储子表达式的文本。正则表达式 /(.*?)空气/ 的子表达式是 (.*?) 它匹配的文本是 北京 将作为返回数组的第1个元素,so'北京空气质量'.match(/(.*?)空气/)[1],等同于 ['北京空气', '北京'][1]

相关文章

网友评论

      本文标题:为何 '北京空气质量'.match(/(.*?)

      本文链接:https://www.haomeiwen.com/subject/pmjnottx.html