创建正则表达式
- 构造函数创建
var parrent1 = new RegExp("box");
var parrent2 = new RegExp("box", "gi");
第一个参数是匹配文本的规则;第二个参数(可选)是模式修饰符。i表示忽略大小写,g表示全局匹配。ES6新增的暂时不说
- 字面量创建
var parrent3 = /box/;
var parrent4 = /box/gi;
语法:/模式/模式修饰符
RegExp实例方法
var str = "this is a Box box box";
var parrent = new RegExp("box", "gi");
1、test()
这个方法用来查找字符串中是否存在正则表达式所写的模式规则。有就返回true,没有就返回false。
console.log(parrent.test(str)); //true
这个方法只要匹配到符合规则的就会返回true,不会继续往下找了,所以这个方法使用全局匹配是没用的。
2、exec()
这个方法也是匹配符合规则的字符,如果没有匹配到就返回null,如果匹配到了返回的是一个数组,这个数组第一个元素是在字符串中匹配到的字符,第二个元素是匹配到的字符的起始索引。
var reg = /xiao/i;
var str = "wo shi yi zhi xiao xiao niao"
console.log(reg.exec(str));
//["xiao", index: 14, input: "wo shi yi zhi xiao xiao niao", groups: undefined]
var reg2 = /da/i
console.log(reg2.exec(str)); //null
3、compile()
该方法用于修改正则表达式,也可以修改模式修饰符。也就是把正则表达式匹配的字符和模式替换掉。
var reg = /xiao/ig;
var str = "wo shi yi zhi Xiao xiao niao";
console.log(reg.exec(str)); //["Xiao", index: 14, input: "wo shi yi zhi Xiao xiao niao", groups: undefined]
var regNew = /wo/i;
reg.compile(regNew);
console.log(reg.exec(str)); //["wo", index: 0, input: "wo shi yi zhi Xiao xiao niao", groups: undefined]
补充:在全局匹配的模式下,exec和test方法匹配到第一个字符串的时候,会把它对应的索引存储起来,下一次再检索同一字符串时,会从刚才存储的位置开始检索。最后当检索结果为null时,下一次从头开始。当然如果没有加g进行全局匹配的话,每次都是从头开始查找。
字符串的模式匹配
上面是正则的方法,下面是字符串的匹配方法,都可以用来匹配。
match()
只接受一个参数,正则表达式或者RegExp对象。(和正则的exec方法一样)。数组第一项是与整个模式匹配的字符串,之后的每一项保存着正则表达式中的捕获组匹配的字符串
var test = "cat, bat, sat, fat";
var pattern = /.at/;
<!--与pattern.exec(test)相同,index表示匹配项在字符串中的位置,input表示应用正则表达式的整个字符串-->
var result = test.match(pattern); // ["cat", index: 0, input: "cat, bat, sat, fat"]
search()
参数与match相同,返回字符串中第一个匹配项的索引。如果没有就返回-1。
var test = "cat, bat, sat, fat";
var pos = test.search(/at/);
alert(pos); //1
replace()
替换字符串,返回值为替换后的字符串,原来的字符串不变。
如果第一个参数是字符串,则替换的只是第一个匹配项,如果想全部替换就得用正则表达式。
var str = "cccc";
console.log(str.replace("c", "老王")); //老王ccc
console.log(str.replace(/c/g,"老王")); //老王老王老王老王
特殊字符
特殊字符,顾名思义就是有特殊含义的字符,所以没办法直接匹配,如果要匹配以下字符,需要在前面加一个转义字符 \。
-
$:匹配输入字符的行尾位置(以...结尾)。
-
(xyz):里面放一个子表达式,作为一组整体去匹配。
-
x*:匹配前面的子表达式0或多次x。
-
x+:匹配前面的表达式1次或多次,最少一次。
-
:匹配除换行符之外的任意单字符。
-
[a-z0-9]:匹配中括号表达式中的任何一个。a-z和0-9之间任意一个。
-
x?:匹配前面的子表达式零次或一次x,或指明一个非贪婪限定符。
-
\:标记特殊字符的转义字符
-
^:匹配输入字符串开始的位置,在中括号使用表示非的意思。
-
x{n}:匹配正好n个x,注意是连续的。
-
x{n,}:匹配最少n个x,连续的。
-
x{n,m}:匹配最少0个最多m个,连续的x。
-
x|y:表示x、y两项之间的一个选择。
//首字符不能是数字(不能以数字开头)
var parrent = /^\D/;
var str = "_cdd";
console.log(parrent.test(str));
//首字符必须是数字(以数字开头)
var parrent = /^\d/;
console.log(parrent.test(str));
//必须以字母结尾
var parrent = /[a-zA-Z]$/;
var str = "ss_";
console.log(parrent.test(str));
非打印字符
-
\f:换页符
-
\n:匹配一个换行符
-
\r:回车符
-
\s:匹配任何空白字符,包括空格、制表符、换页符等[\f\n\r\t\v]
-
\S:匹配任何非空白字符,
-
\t:制表符
-
\v:垂直制表符
-
\d:匹配数字,效果同[0-9]
-
\w:匹配数字、字母、。效果同[0-9a-zA-Z]
-
\W:匹配非数字、字母、下划线。同[^0-9a-zA-Z_]
//匹配 数字、字母中的任意一个和ABC
var parrent = /[0-9a-zA-Z]ABC/i;
var str = "eABcCds_ABCsdf";
console.log(parrent.test(str));//true
//匹配 数字、空白字符中的任意一个
var str = "this is 3haha";
var parrent = /[\d\s]/;
console.log(parrent.test(str));//true
//匹配 包含 b和空白字符和x
var str = "this is b xhaha.";
var parrent = /b\sx/;
console.log(parrent.test(str));//true
//按照空格或,或!中的任意一个进行字符串切割
var str = "this is a box,box,box!";
console.log(str.split(/[ ,!]/));//["this", "is", "a", "box", "box", "box", ""]
网友评论