javascript-regex-test
简介
javascript中test
是Regex
对象上的一个方法,用来检测字符串是否满足某种规则,举个例子:判断一个字符串中是否包含单词hello
。
1 | const regex = new RegExp('hello'); |
简化一下上面的代码,js中正则表达式可以用//
包裹,所以可以写成:
1 | const regex = /hello/; |
再简化一下,甚至可以写成一行:
1 | console.log(/hello/.test('hello, world!')); // true |
规则:regex.test(str), 这个表达式中,调用者是正则表达式,参数是字符串,返回值是布尔值。
大小写无关的匹配
默认情况下,正则表达式是匹配时是区分大小写的,如果要忽略大小写进行匹配,可以在正则表达式后面加上/i
标志。
1 | console.log(/hello/i.test('Hello, world!')); // true |
多行匹配
默认情况下,正则表达式是单行匹配的,如果要多行匹配,可以在正则表达式后面加上/m
标志。
1 | const str = ` |
因为默认情况下,^
只匹配字符串的开头,所以上面的代码返回false
。如果要多行匹配,可以这样写:
1 | const str = ` |
/m
表示多行匹配,即使hello
不在字符串的首行,也能匹配到。
注意,这里/m
真正的含义如下:
- 如果不加
/m
,^
和$
匹配整个字符串的开头和结尾。 - 如果加了
/m
,^
和$
匹配每一行的开头和结尾。
以上面代码为例,如果不加/m
,则^hello
匹配整个字符串的开头,但是整个字符串的开头是Hi,
,所以返回false
。如果加了/m
,则^hello
匹配每一行的开头,而第二行的开头是hello
,所以返回true
。
注意, 如果没有给test
传递参数,那么test会尝试匹配字符串undefined
1 | console.log(/undefined/.test()); // true |
全局匹配
默认情况下,test
只会匹配第一个满足条件的字符串,如果要全局匹配,可以在正则表达式后面加上/g
标志。
注意:你永远不需要在test
方法上加/g
标志,因为test
方法只返回一个布尔值,而不是匹配到的字符串。
使用/g
标志会改变正则表达式的lastIndex
属性,这个属性会影响到test
方法的行为,导致每次test匹配都从lastIndex
开始,而不是从字符串的开头开始。
下面的代码中,为何第二次调用test
方法返回false
呢?
1 | const regex = /foo/g; |
分析一下:第一次匹配开始之前,lastIndex = 0, 指向字符串开头,第一次匹配成功后,lastIndex = 3, 下一次匹配从则从下标3开始,但是字符串foo
长度为3,后面已经没有字符了,所以导致第二次匹配失败!崩溃吗?
/g
选项通常用于String.prototype.replace
方法。
1 | const str = 'foobarfoo'; |
javascript中还有一个String.prototype.replaceAll
方法,看名字好像会替换所有满足条件的匹配,但是使用这个方法时,必须添加/g
标志,否则会报错,真是脱裤子放屁呀!
1 | const str = 'foobarfoo'; |