一、正则表达式的创建及修饰符
1.字面量声明
在一对反斜线中写正则表达式内容,如/abc/ ;正则表达式里面不需要加引号 不管是数字型还是字符串型
var reg = /正则表达式/修饰符;
var reg = /abc/;
2.构造函数
构造正则表达式的实例,new RexExp("正则表达式",“修饰符”);
var reg =new RegExp("正则表达式","修饰符");
var reg = new RegExp("abc","g");
3.修饰符
g:(global)表示全局匹配
i: (ignoreCase )表示不区分大小写
m: (multiline )表示开启多行匹配
对于一个正则表达式是不是开启了这些修饰符可以通过global、ignoreCase、multiline,这些正则表达式属性来查看。
var reg = /abc/gim;
console.log(reg.global); //true 查看是否开启全局匹配
console.log(reg.ignoreCase);//true 查看是否开启忽略大小写
console.log(reg.multiline);//true 查看是否开启多行匹配
y模式
y 模式表示匹配到不符合的就停掉,不会继续往后匹配,必须连续的符合条件的。
var name = "xxxxxx,1111111232111,22224542325488,641131234d16544aaasssssaaa";
// 查到数字,逗号有或没有
// y 模式找到后就不会继续往后找
var reg = /(\d+),?/y;
reg.lastIndex = 7;
var qqList = [];
while ((res = reg.exec(name))) {
console.log(res);
qqList.push(res[1]);
}
console.log(qqList); // [ '1111111232111', '22224542325488', '641131234' ]
更加详细的y模式可以去到JavaScript:正则表达式的/y标识 - 紫云飞 - 博客园 (cnblogs.com)
二、 正则表达式的实例方法
1.exec
作用: 用来匹配字符串中符合正则表达式的字符串。
返回值: 成功返回一个数组,[匹配成功内容,匹配内容的起始下标,参数字符串,
groups: undefined ];失败返回 null;
var str = "Hello World Hello";
var reg = /Hello/;
var reg1 = /exe/;
var reg2 = /Hello/g;
// lastIndex 就是每次正则表达式查找的起点就是lastIndex
/* 当正则表达式置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,
当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,
test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮 */
console.log(reg.exec(str), reg.lastIndex); //[ 'Hello', index: 0, input: 'Hello World Hello', groups: undefined ] 0
console.log(reg.exec(str), reg.lastIndex); //[ 'Hello', index: 0, input: 'Hello World Hello', groups: undefined ] 0
console.log(reg1.exec(str), reg1.lastIndex); //null 0
console.log(reg2.exec(str), reg2.lastIndex); //[ 'Hello', index: 0, input: 'Hello World Hello', groups: undefined ] 5
console.log(reg2.exec(str), reg2.lastIndex); //[ 'Hello', index: 12, input: 'Hello World Hello', groups: undefined ] 17
2.text
作用 :判断字符串是否有符合正则表达式的字符串。
返回值: 成功返回ture 失败返回false
var str = "Hello World Hello";
var reg = /Hello/;
var reg1 = /exe/;
var reg2 = /Hello/g;
// lastIndex 就是每次正则表达式查找的起点就是lastIndex
/* 当正则表达式置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,
当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,
test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮 */
console.log(reg.test(str), reg.lastIndex); //true 0
console.log(reg.test(str), reg.lastIndex); //true 0
console.log(reg1.test(str), reg1.lastIndex); //false 0
console.log(reg2.test(str), reg2.lastIndex); //true 5
console.log(reg2.test(str), reg2.lastIndex); //true 17
注意: 当正则表达式置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮。没有设置全局匹配时,每一次匹配都从字符串的下标为0开始。
三、元字符和数量词和特殊字符
1.元字符和字符边界
^ | 匹配输入开始。表示匹配行首的文本(以谁开始)/^写在[]里面是补充字符集 |
$ | 匹配输入结尾。表示匹配行尾的文本(以谁结束) |
[] | 方括号用于查找某个范围内的字符 |
字母和数字字符 | 自身 |
.(英文的 点) | 匹配除换行符\n和回车符之外的任何单个字符,等效于[^\n\r] |
\d | 0-9的数字 |
\D | 除0-9的数字 |
\w | 0-9、a-z、A-Z、_ (下划线) |
\W | 除0-9、a-z、A-Z、_ (下划线)外的其他字符 |
\s | 匹配任何Unicode空白字符,包括空格、制表符、换页符等,等效 于[\f\t\n\r] |
\S | [^\f\t\n\r] |
\o | Null字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车符 |
字符集合[]
一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符‘-’指定一个范围.在 字符集合[]中特殊的字符不会被当做特殊含义的字符,只会当做本身来进行匹配。列如().?|*+等等没有被\转义字符修饰的都会被当做本身意义去解释(^开始符除外)。
var str = "abc qwe abd";
var reg1 = /[abc]/; // 只要包含有a 或者 包含有b 或者包含有c 都返回为true
console.log(reg1.exec(str)); //[ 'a', index: 0, input: 'abc qwe abd', groups: undefined ]
var str = "abc qwe abd1";
var reg1 = /[0-9]/gim;
console.log(reg1.exec(str)); //[ '1', index: 11, input: 'abc qwe abd1', groups: undefined ]
var str = "abc qwe abd1,2";
var reg1 = /[^abc ]/gim; //除了abc 以外的字符
console.log(reg1.exec(str)); //[ 'q', index: 4, input: 'abc qwe abd1,2', groups: undefined ]
var str = "abc qwe abd1,2";
console.log(str); //abc qwe abd1,2
var reg1 = /[\d]/gim;
console.log(reg1.exec(str)); //[ '1', index: 11, input: 'abc qwe abd1,2', groups: undefined ]
/* 特殊点*/
var reg2 = /[().*|+?]/g;
var str = "().*+ad|f?d";
var arr = reg2.exec(str);
while (arr !== null) {
console.log(arr);
arr = reg2.exec(str);
}
/* [ '(', index: 0, input: '().*+adf?d', groups: undefined ]
[ ')', index: 1, input: '().*+adf?d', groups: undefined ]
[ '.', index: 2, input: '().*+adf?d', groups: undefined ]
[ '*', index: 3, input: '().*+adf?d', groups: undefined ]
[ '+', index: 4, input: '().*+adf?d', groups: undefined ]
[ '|', index: 7, input: '().*+ad|f?d', groups: undefined ]
[ '?', index: 9, input: '().*+ad|f?d', groups: undefined ] */
分组()和 选择符使用:或者( | )
一般来说分组和选择符一起使用,对于多个匹配的字符串进行匹配。
var reg = /(123|456)/;
var title = "1234688";
var title1 = "23456788";
console.log(reg.test(title)); // true
console.log(reg.exec(title)); //[ '123', '123', index: 0, input: '1234688', groups: undefined ]
console.log(reg.exec(title1));//[ '456', '456', index: 2, input: '23456788', groups: undefined ]
开始符(^)和结算符($)
^ 匹配输入开始。表示匹配行首的文本(以谁开始)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。 在[]字符集合中被当做取反操作。
$ 匹配输入结尾。表示匹配行尾的文本(以谁结束)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。
// ^的使用
var reg = /^123/g;
var str = "1232424";
var str1 = "232435";
console.log(reg.test(str)); //true
console.log(reg.test(str1)); //false
// $的使用
var reg = /567$/g;
var str = "1asfffdfdfdaw24224567";
var str1 = "232435sfdsfd667";
console.log(reg.test(str)); //true
console.log(reg.test(str1)); //false
// ^$的一起使用
var reg = /^1234567$/g;
var str = "1234567";
var str1 = "123456";
console.log(reg.test(str)); //true
console.log(reg.test(str1)); //false
2.数量词
字符 | 含义 |
---|---|
* | >=0次 |
+ | ≥1 次 |
? | 0或1次 |
{n} | n 次 |
{n,} | ≥n 次 |
{n,m} | n到m 次 |
// 数量符
// * 允许出现0次或多次等价于{0,}
var reg = /^a*$/;
console.log(reg.test("aaaa")); // true
console.log(reg.test("a")); // true
console.log(reg.test("")); // true
// + 允许出现1次或多次
var reg = /^a+$/;
console.log(reg.test("aaaa")); // true
console.log(reg.test("aaa")); // true
console.log(reg.test("")); // false
// ? 允许出现1次或0次
var reg = /^a?$/;
console.log(reg.test("aaaa")); // false
console.log(reg.test("aa")); // false
console.log(reg.test("a")); // true
console.log(reg.test("")); // true
// {n} 允许重复n次
var reg = /^a{4}$/;
console.log(reg.test("aaaa")); // true
console.log(reg.test("aaaaa")); // false
console.log(reg.test("a")); // false
console.log(reg.test("")); // false
// {n,} 最少重复n次
var reg = /^a{4,}$/;
console.log(reg.test("aaaa")); // true
console.log(reg.test("aaaaa")); // true
console.log(reg.test("a")); // false
console.log(reg.test("")); // false
// {n,m} 允许重复出现n次-m次之间,也就是>=n且<=m
var reg = /^a{4,6}$/;
console.log(reg.test("aaaa")); // true
console.log(reg.test("aaaaa")); // true
console.log(reg.test("a")); // false
console.log(reg.test("aaaaaaaa")); // false
四、综合使用
// 验证字符串的组成规则,第一个须为数字,后面可以是字母、数字、下划线,总长度为5-20位
var reg = /^[\d][\w]{4-19}$/;
验证QQ号
// 不能以数字0开始,只能由数字组成,长度为5-11位
var reg = /^[1-9]\d{4,10}$/;
var str1 = "12311111111";
var result1 = reg.exec(str1);console.log(result1);
验证手机号
var reg = /^1[34578]\d{9}$/;
console.log(reg.test("18888888888"));//true