摘要:匹配字符对象属性属性描述对象是否具有标志对象是否具有标志一个整数,标识开始下一次匹配的字符位置对象是否具有标志正则表达式的源文本对象方法检索字符串中指定的值,返回或者。主机名允许数字和英文,长度不确定。
参考资料:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
创建正则表达式对象有两种创建正则表达式的方式
字面量
在脚本加载后编译
正则表达式是静态的时候性能会比较高
构造函数
正则表达式运行时编译
适合需要动态更改规则的情况
let reg1 = /ab+c/; // 字面量 let reg2 = new RegExp("ab+c"); // 构造函数 let reg3 = new RegExp("/ab+c/"); let reg4 = new RegExp(/ab+c/, i); // 同等 /ab+c/i
简单的使用使用构造函数创建正则时,第二个参数只能传 "g"、"i" 和 "m",否则会出异常。
先看一个匹配qq号的例子,然后再根据这个例子往下看,这样学起来会相对轻松。
qq号的规则:
全是数字
不能以0开头 -> ^[1-9]{1} 简化-> ^[1-9]
最低5位,最高10位 -> [0-9]{4,9}$ 简化-> d{4,9}$
let reg = /^[1-9]{1}d{4,9}$/; reg.test("1234567890"); // true reg.test("12345678901"); // false reg.test("0234567890"); // false修饰符( i g m )
名称 | 描述 | 例子 |
---|---|---|
i | 对大小写不敏感 | /abc/i |
g | 全局匹配(不会在第一次匹配成功后停止) | /abc/g |
m | 多行匹配 | /abc/m |
字符范围( [] )正则表达式默认匹配成功后就不会继续匹配。如果想匹配字符串中所有符合的子串,就要加g
使用[]表示定义匹配字符的范围。
let reg = /[a-zA-z0-9]/; //匹配小写和大写的a-z还有0-9 console.log(reg.test("A")); // true console.log(reg.test("@")); // false
量词reg.test()方法是RegExp对象方法,匹配成功返回true,否则返回false。
量词 | 描述 | 例子 |
---|---|---|
n{x} | 匹配包含 X 个 n 的序列的字符串。 | /[0-9]{4}/ |
n{x,y} | 匹配包含 X 至 Y 个 n 的序列的字符串。 | /[0-9]{4,6}/ |
n{x,} | 匹配包含至少 X 个 n 的序列的字符串。 | /[0-9]{4,}/ |
n* | 匹配任何包含零个或多个 n 的字符串。 | /n*/ |
n+ | 匹配任何包含至少一个 n 的字符串。 | /n+/ |
n? | 匹配任何包含零个或一个 n 的字符串。 | /n?/ |
n$ | 匹配任何结尾为 n 的字符串。 | /n$/ |
^n | 匹配任何开头为 n 的字符串。 | /^n/ |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 | /lo(?= java)/ |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 | /lo(?! java)/ |
reg.test()方法,匹配字符串,匹配成功返回true,否则返回false
n{x} 匹配包含 X 个 n 的序列的字符串。
let reg = /[0-9]{4}/; // 匹配4位连续的子串,范围是0-9的数值 reg.test("1234"); // true reg.test("123"); // false reg.test("12a45"); // false
{x,y}:匹配包含 X 至 Y 个 n 的序列的字符串。
let reg = /[0-9]{4,6}/; // 匹配4~6位连续的子串,范围是0-9的数值 reg.test("12345"); // true reg.test("123"); // false reg.test("123a56"); // false
{x,}:匹配包含至少 X 个 n 的序列的字符串。
let reg = /[0-9]{4,}/; // 匹配最少4位连续的子串,范围是0-9的数值 reg.test("12345"); // true reg.test("123"); // false reg.test("123a567"); // false* + ?
reg.exec(),这个方法和test()差不多,区别在于返回值。匹配成功会返回一个数组,匹配失败会返回null。
返回值的数组中还有一个index的参数,这个参数是匹配到的子串所在字符串的起始索引。
*、+、?这仨解释起来有点绕,直接看代码会秒懂。
*:匹配任何包含零个或多个 n 的字符串。
let reg = /n*/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["nnn"] reg.exec("aaa"); // [""],字符串中没有n,但是*可以匹配没有n的情况(零个)
+:匹配任何包含至少一个 n 的字符串。
let reg = /n+/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["nnn"] reg.exec("aaa"); // null
?:匹配任何包含零个或一个 n 的字符串。
let reg = /n?/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["n"],无论有多少个连续的n,都只会匹配到一个。 reg.exec("aaa"); // [""]^和$(开头和结尾)
^:匹配任何开头为 n 的字符串。
let reg = /^n/; reg.test("nbcd"); // true reg.test("efghn"); // fasle
$:匹配任何结尾为 n 的字符串。
let reg = /n$/; reg.test("nbcd"); // fasle reg.test("efghn"); // true?= 和 ?!
?=n:匹配任何其后紧接指定字符串 n 的字符串。
// 匹配 lo,但是这个lo要在" java"之前 let reg = /lo(?= java)/; // 注意空格 reg.exec("hello javascript"); // ["lo"], index: 3
?!n:匹配任何其后没有紧接指定字符串 n 的字符串。
// 匹配 lo,但是这个lo不能在" java"之前 let reg = /lo(?! java)/; // 注意空格 reg.exec("hello javascript lo"); // ["lo"], index: 17提取匹配字符串( () )
使用()提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
可以通过$x的方式提取出来。(x表示一个数字)
let reg = /([w]+?)bc([d])/; let str = "abc123"; reg.exec(str); // ["abc1", "a", "1"],第二个元素是$1,第三个元素是$2 str.replace(reg, "$1$2"); //a123, reg匹配到的是"abc1",匹配到的字符串用$1和$2替换掉,所以结果是 a123元字符
元字符 | 描述 | 例子 |
---|---|---|
. | 查找单个字符,除了换行和行结束符。 | /h.t/ -> "hxt" |
w | 查找单词字符。 | /w/ |
W | 查找非单词字符。 | /W/ |
d | 查找数字。 | /d/ |
D | 查找非数字字符。 | /D/ |
s | 查找空白字符。 | /s/ |
S | 查找非空白字符。 | /S/ |
匹配单词边界。 | // | |
B | 匹配非单词边界。 | /B/ |