为何 '北京空气质量'.match(/(.*?)
2017-04-04 本文已影响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
属性声明的是对stringObjec
t 的引用。
- 如果
- 如果
regexp
具有标志g
,则match()
方法将执行全局检索,找到stringObject
中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是stringObject
中所有的匹配子串,而且也没有index
属性或input
属性。
正则表达式 /(.*?)空气/
表示以任意个任意字符开始以 空气
结束的字符段。
根据上面的解释,'北京空气质量'.match(/(.*?)空气/)
中的 regexp
表达式没有标志 g
,如果找到匹配的文本将返回一个数组,该数组的非第0个元素存储子表达式的文本。正则表达式 /(.*?)空气/
的子表达式是 (.*?)
它匹配的文本是 北京
将作为返回数组的第1个元素,so,'北京空气质量'.match(/(.*?)空气/)[1]
,等同于 ['北京空气', '北京'][1]
。