一、正则表达式
正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来
1、创建正则表达式的对象
- 语法:
var 变量 = new RegExp("正则表达式","匹配模式");
- 使用typeof检查正则对象,会返回object
var reg = new RegExp("a"); //这个正则表达式可以来检查一个字符串中是否含有a
console.log(reg); //结果 "/a/"
console.log(typeof reg); //结果 object
- 在构造函数中可以传递一个匹配模式作为第二个参数,
- 可以是
- i 忽略大小写
- g 全局匹配模式
var reg2 = new RegExp("ab","i");
那么如何去检测正则表达式规定的规则呢?
- 正则表达式的方法:
- test()
- 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则,
- 如果符合则返回true,否则返回false
var reg = new RegExp("a"); //这个正则表达式可以来检查一个字符串中是否含有a
var str = "abcd";
var result = reg.test(str);
console.log(result); //true
var reg2 = new RegExp("ab","i");
console.log(reg2.test("Ac")); // false
console.log(reg2.test("Ab")); // true
2、使用字面量创建正则表达式
- 语法:
var 变量 = /正则表达式/匹配模式
- 使用字面量的方式创建更加简单
使用构造函数创建更加灵活,因为可以向构造函数传一个变量,变量是什么,正则就是什么,所以更加灵活
var reg = new RegExp("a","i");
var reg = /a/i;
// 以上两种写法一模一样
创建一个正则表达式,检查一个字符串中是否有a或b
/*
* 使用 | 表示或者的意思
*/
reg = /a|b|c/;
创建一个正则表达式检查一个字符串中是否有字母
/*
* []里的内容也是或的关系
* [ab] == a|b
* [a-z] 任意小写字母
* [A-Z] 任意大写字母
* [A-z] 任意字母
* [0-9] 任意数字
*/
reg = /[A-z]/;
reg = /[0-9]/;
检查一个字符串中是否含有 abc 或 adc 或 aec
reg = /a[bde]c/;
除了 [^ ]
reg = /[^ab]/; //除了ab以外的 ,都可以
console.log(reg.test("abc")) ; //这也是true
console.log(reg.test("ab")) ; //这是
===============================================
reg = /[^0-9]/;
console.log(reg.test("12a3456"));
3、字符串和正则相关的方法
split()
- 可以将一个字符串拆分为一个数组
- 方法中可以传递一个正则表达式作为参数,这样方法将会根据正则表达式去拆分字符串
- 这个方法即使不指定全局匹配,也会全都插分
var str = "1a2b3c4d5e6f7";
/*
* 根据任意字母来将字符串拆分
*/
var result = str.split(/[A-z]/);
console.log(result); //"1,2,3,4,5,6,7"
search()
- 可以搜索字符串中是否含有指定内容
- 如果搜索到指定内容,则会返回第一次出现的索引,如果没有搜索到返回-1
- 它可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串
- search()只会查找第一个,即使设置全局匹配也没用
str = "hello abc hello aec afc";
console.log(str.search("abc")); //找到第一个str中第一个abc,索引为6,所以这行打印6
/*
* 搜索字符串中是否含有abc 或 aec 或 afc
*/
result = str.search(/a[bef]c/);
console.log(result); //会打印6,因为先找到了abc,如果没有abc才会继续往后找aec
match()
- 根据正则表达式,从一个字符串中将符合条件的内容提取出来
- 默认情况下我们的match只会找到第一个符合要求的内容,找到以后就停止检索
- 我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容
- 可以为一个正则表达式设置多个匹配模式,且顺序无所谓
- match()会将匹配到的内容封装到一个数组中返回,即使只查询到一个结果
str = "1a2a3a4a5e6f7A8B9C";
result = str.match(/[A-z]/);
console.log(result); //这是没有设置的默认情况,只找到第一个符合要求的,也就是a
result1 = str.match(/[a-z]/ig); //i忽略大小写,g全局模式
console.log(result1); //"a,a,a,a,e,f,A,B,C"
console.log(Array.isArray(result1)); //true, result1是一个数组,存储了匹配到的内容
replace()
- 将字符串中指定内容替换为新的内容
- 参数:
- 被替换的内容,可以接受一个正则表达式作为参数
- 新的内容
- 默认只会替换第一个
str = "1a2a3a4";
result = str.replace(/[a-z]/gi , "@_@");
console.log(result); //"1@_@2@_@3@_@4"
result = str.replace(/[a-z]/gi , "");
console.log(result); //"1234"
4、正则表达式语法
量词
/*
* 创建一个正则表达式检查一个字符串中是否含有aaa
*/
var reg = /aaa/;
但如果我们要很多很多a,难道要/aaaaaaaaaaaaaaaa/这样写吗?
这就引入了量词
量词语法
- 通过量词可以设置一个内容出现的次数
- 量词只对它前边的一个内容起作用
- {n} 正好出现n次
- {m,n} 出现m-n次
- {m,} m次以上
- +至少1次 相当于 {1,}
- ? 0次或1次 相当于 {0,1}
- *0次或多次 相当于 {0,}
//aaa
var reg = /a{3}/;
//ababab
reg = /(ab){3}/;
reg = /ab{1,3}c/; //abc或abbc或abbbc
reg = /ab{3,}c/; //ab出现3次及以上c
reg = /ab+c/; //b至少1次
reg = /ab*c/; //b出现0次或多次
reg = /ab?c/; //b出现0次或1次
检查一个字符串中是否以a开头
- ^ 表示开头
- $ 表示结尾
reg = /^a/; //匹配开头的a
console.log(reg.test("abcabca")); //true
console.log(reg.test("bcabca")); //false
reg = /a$/; //匹配结尾的a
console.log(reg.test("abcabca")); //true
console.log(reg.test("bcabc")); //false
/*
* 如果在正则表达式中同时使用^ $则要求字符串必须完全符合正则表达式
*/
reg = /^a$/; //a既得是开头也得是结尾,所以只有a符合,其他都是false
console.log(reg.test("aaa")); //false
console.log(reg.test("a")); //true
reg = /^a|a$/; //以a开头或以a结尾
console.log(reg.test("aaa")); //true
console.log(reg.test("bbca")); //true
小练习
- 创建一个正则表达式,用来检查一个字符串是否是一个合法手机号
- 手机号的规则:
- 1 3 567890123 (11位)
- 以1开头
- 第二位3-9任意数字
- 三位以后任意数字9个
- ^1 [3-9] [0-9]{9}$
var phoneStr = "13067890123";
var phoneReg = /^1[3-9][0-9]{9}$/;
console.log(phoneReg.test(phoneStr)); //true
phoneStr = "11067890123";
console.log(phoneReg.test(phoneStr)); //false
转义字符
当我们想检查一个字符串中是否含有 . 时,不能直接var reg = /./
,因为 . 表示任意字符
console.log(reg.test("abc")) //这样也是true
所以有些时候,字符代表了特殊含义,想让他表示成原本的意义时就需要转义
- 在正则表达式中使用 \ 作为转义字符
-
. 来表示.
-
\ 表示\
-
注意:使用构造函数时,由于它的参数是一个字符串,而\是字符串中转义字符,如果要使用\则需要使用\来代替
-
var reg = /\./;
reg = /\\/;
reg = new RegExp("\\."); //要用两个\\代表转义字符\ 相当于var reg = /\./;
reg = new RegExp("\\\\"); //要用两个\\代表转义字符\ 相当于var reg = /\\/;
- \w
- 任意字母、数字、_ 相当于 [A-z0-9_]
- \W
- 除了字母、数字、_ 相当于 [^A-z0-9_]
- \d
- 任意的数字 [0-9]
- \D
- 除了数字 [^0-9]
- \s
- 空格
- \S
- 除了空格
- \b
- 单词边界
- \B
- 除了单词边界
reg = /\w/;
reg = /\W/;
reg = /\d/;
reg = /\D/;
reg = /\s/;
reg = /\S/;
/*
* 创建一个正则表达式检查一个字符串中是否含有单词child
*/
reg = /child/;
console.log(reg.test("hellochildren ")); //只要含有child,结果就是true
reg = /\bchild\b/;
console.log(reg.test("hellochild ")); //false
console.log(reg.test("hello child ")); //true
//接收一个用户的输入
//var str = prompt("请输入你的用户名:");
var str = " he llo ";
console.log(str);
//去除掉字符串中的前后的空格
//去除空格就是使用""来替换空格
// str = str.replace(/\s/g , "");
// console.log(str); //hello,它会把中间的空格也去掉,就是所有的空格都去掉了
//去除开头的空格
str = str.replace(/^\s*/, ""); //如果不加*,只会匹配开头的一个空格,所以是开头的多个空格,用*
//去除结尾的空格
//str = str.replace(/\s*$/, "");
// /^\s*|\s*$/g 匹配开头和结尾的空格,意思为去除开头或结尾的空格
// 加全局匹配时因为,|为或的意思,如果不全局匹配,reg认为去除完前面的空格了,就不继续匹配了
str = str.replace(/^\s*|\s*$/g,"");
console.log(str);
5、综合练习——邮件正则
电子邮件
hello . nihao @ abc . com . cn
- 任意字母数字下划线 .任意字母数字下划线(整个这部分可有可无,所以用*) @ 任意字母数字(至少1位,所以用+) .任意字母(2-5位) .任意字母(2-5位) //后两部分整体出现1-2次,所以整体{1,2}
- \w{3,} (.\w+)* @ [A-z0-9]+ (.[A-z]{2,5}){1,2}
var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;
var email = "[email protected]";
console.log(emailReg.test(email)); //true