最近正在拜读老姚的《JavaScript 正则表达式迷你书》,碰巧项目中也会时不时的用到正则,所以今天来总结一下JS中有关正则的方法。
RegExp对象方法
test()
字符串的test()
方法,比较常用在判断语句中,最简单的RegExp方法了,用于检测一个字符串是否匹配某个模式:
RegExpObject.test(string);
// 该方法是正则进行调用,下面提到的match()是字符串进行调用,两者容易搞混
// 很显而易见,属于什么对象就被什么调用
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
exec()
这个方法说实话目前还没有用过,所以我就借鉴下MDN的描述:
exec()
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
。调用格式如下:
RegExpObject.exec(string);
如果匹配成功,exec()
方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。
如果匹配失败,exec()
方法返回 null
。
如果你只是为了判断是否匹配(true
或false
),可以使用 RegExp.test()
方法,或者 String.search()
方法。
光看定义根本看不出来应该怎么用,那么就举个MDN的🌰:
var matches = /(hello \S+)/.exec('This is a hello world!');
console.log(matches);
// ["hello world!", "hello world!", index: 10, input: "This is a hello world!"]
从上面返回的数组结果可知,数组添加了两个额外的属性,分别是:index, input
index: 匹配文本的第一个字符的位置.
input: 顾名思义,就是指输入的整体的文本了.
执行exec函数时,尽管是全局匹配的正则表达式,但是exec方法只对指定的字符串进行一次匹配,获取字符串中第一个与正则表达式想匹配的内容,并且将匹配内容和子匹配的结果存储到返回的数组中。
例如:/\d/g.exec('a22')
,返回的结果为: ["2", index: 1, input: "a22"]
String对象方法
String一共有4中使用正则表达式的方法,包括search()、replace()、match()和split()。
1.search()
search()的参数是一个正则表达式,返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,它将返回-1。举个例子:
"JavaScript".search(/script/i);
// 返回4
如果search()的参数不是正则表达式,首先会通过RegExp构造函数将它转换为正则表达式,search()方法不支持全局检索,因为会忽略正则表达式参数中的修饰符g。
2.replace()
该方法用以执行检索和替换操作。其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。如果正则表达式中设置了修饰符g,那么源字符串中所有与模式匹配的子串都将替换成第二个参数指定的字符串;如果不带修饰符g,则只替换所匹配的第一个子串。如果replace()的第一个参数是字符串而不是正则表达式,那么replace()将直接搜索这个字符串,而不会向search()一样先转换为正则表达式。举个例子:
str.replace(/javascript/gi,"JavaScript");
//将所有不区分大小写的javascript替换成JavaScript
3.match()
match()方法的唯一参数就是一个正则表达式,返回的是一个由匹配结果组成的数组。如果该正则表达式设置了修饰符g,则该方法返回的数组包含字符串的所有匹配结果。比如:
"1 plus 2 equals 3".match(/\d+/g)
// 返回 ["1","2","3"]
如果没有设置修饰符g,那么就不会进行全局检索,只检索第一个匹配。但是即使match()执行的不是全局检索,也返回一个数组。这时,数组的第一个元素就是匹配的字符串,余下的元素则是正则表达式中用圆括号括起来的子表达式。如果没有,则返回null
。
4.split()
该方法用以将调用它的字符串拆分为一个子串组成的数组,分隔符就是方法的参数。例如:
'123456'.split('');
// 将'123456'使用空字符串''进行分割
// 返回["1", "2", "3", "4", "5", "6"]
split()的参数也可以是一个正则表达式。
以上就是目前所遇到的所有有关正则的方法,以后有新的知识再来补充。