一、什么是正则表达式
正则表达式就是用来检索、查找某部分内容的一种模式。
比如说,有一个字符串str = “abdhfjkasngl”,我可以定义一个正则表达式,用来查找该字符串中的某一个或某些字符。
二、正则表达式的定义
js中提供了两种正则表达式的定义方法
(1)字面量的形式:
var reg = /abc/;
它就表示用来查找abc这个字符串
(2)构造函数的方式:
和date对象类似,js内部提供了正则表达式对象。我们可以通过构造函数的方式来定义正则表达式。
var reg = new RegExp("abc","m");
参数中第一个参数表示查找的内容,第二个参数是修饰符,这个我们待会详细说。
三、正则表达式的语法规则及使用方法
1.修饰符
首先要说的就是js正则表达式中的修饰符,js中的修饰符有"i",“g”,“m”
|i| 表示忽略大小写 |
|-g-|-表示全局匹配-|
| m | 表示执行多行匹配 |
接下来看具体例子:
var reg = /abc/i;
var str = "ABCabc";
console.log(str.match(reg)); //["ABC"]
如果不指定全局查找的话,那么查找的时候会只查找第一个匹配的字符串。查找到即停止。
所以如果需要进行全局匹配的话,这时就需要用到修饰符“g”了。
var reg = /abc/ig;
var str = "ABCabc";
console.log(str.match(reg)); //["ABC", "abc"]
接下来看修饰符"m’’
var reg = /^abc/ig;
var str = "ABC\nabc";
console.log(str.match(reg)); //["ABC"]
转义字符\n表示换行,如果只是执行全局匹配的话,并不能匹配到第二行的abc,如果再加上多行匹配修饰符"m"才可以执行多行匹配。
var reg = /^abc/igm;
var str = "ABC\nabc";
console.log(str.match(reg)); // ["ABC", "abc"]
2. 方括号[ ]
方括号用于查找某个范围内的字符,一个方括号只能匹配一个字符
[abc] | 查找方括号之间的任何字符。 |
---|---|
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
– | – |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
– | – |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
– | – |
[^adgk] | 查找给定集合外的任何字符。 |
接下来看具体例子:
var reg = /[cd][d]/g;
var str = "abcd";
console.log(str.match(reg)); // ["cd"]
var reg = /[0-9A-Za-z][cd][d]/g;
var str = "abcd";
console.log(str.match(reg)); // ["bcd"]
var reg = /[^a][^b]/g;
var str = "abcd";
console.log(str.match(reg)); // ["bc"]
/(abc|bcd)/查找指定的部分,查找abc或bcd
var reg = /(abc|bcd)/g;
var str = "bcd";
console.log(str.match(reg)); // ["bcd"]
3.元字符
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
var reg = /\w/g;
var str = "bcd";
console.log(str.match(reg)); // ["b", "c", "d"]
var reg = /\w\d/g;
var str = "b9d";
console.log(str.match(reg)); // ["b9"]
如果要写一个正则用来表示所有的字符呢?
var reg = /[\d\D]/;
“.”表示查找单个字符,除了换行和行结束符
“.”[^\r\n]
\s[\t\r\n\f\v]
一个元字符也只能代表一个字符,只能查找单个字符。
4.量词
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。{1, } |
n* | 匹配任何包含零个或多个 n 的字符串。{0, } |
n? | 匹配任何包含零个或一个 n 的字符串。{0,1} |
n{X} | 匹配包含 X 个 n 的序列的字符串。 {X} |
n{X,Y} | 匹配包含 X 或 Y 个 n 的序列的字符串。 {X,Y} |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 {X, } |
在匹配的过程中遵循的是贪婪匹配原则
var reg = /\w{5}/g;
var str = "abcds";
console.log(str.match(reg)); // ["abcds"]
var reg = /\w+/g;
var str = "abcds";
console.log(str.match(reg)); // ["abcds"]
正则表达式的匹配原则是贪婪匹配,如果想要执行非贪婪的匹配只需要在表达式后面加?即可,如??,+?,*?等
需要注意的是,不管是贪婪模式还是非贪婪模式,正则表达式总是会寻找字符串中第一个可能匹配的位置,如,对于字符串aaabb,/a+b/会匹配aaabb,/a+?b/会匹配aaab而不是子串中更短的ab。
5. 特定修饰符
修饰符 | 意义 |
---|---|
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
var reg = /^abc/g;
var str = "abcds";
console.log(str.match(reg)); // ["abc"]
var reg = /cds$/g;
var str = "abcds";
console.log(str.match(reg)); // ["cds"]
var reg = /\w(?=b)/g;
var str = "aabbccdd";
console.log(str.match(reg)); // ["a", "b"]
接下来看问题:写一个正则表达式检验字符串首尾是否含有数字
var reg = /(^\d|\d&)/g;
var str = "9bcds";
console.log(reg.test(str)); // true
如果是判断是否首尾都含有数字呢?
var reg = /^\d[\d\D]*\d$/g;
var str = "9bcds";
console.log(reg.test(str));
6.括号()
括号表示分组形成子表达式,子表达式可以被引用
var reg = /(\w)\1\1\1/g;
var str = "aaaa";
console.log(str.match(reg)); //["aaaa"]
\1表示引用第一个子表达式的值。
思考,如果是要查找aabb形式的字符串呢?
var reg = /(\w)\1(\w)\2/g;
var str = "aabbccdd";
console.log(str.match(reg)); // ["aabb", "ccdd"]
7.正则表达式对象的属性
lastIndex 表示一个整数,标示开始下一次匹配的字符位置。
8.正则表达式的方法
方法 | 含义 |
---|---|
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 |
test | 检索字符串中指定的值。返回 true 或 false。 |
先讲test,test主要用于检查指定字符串中是否匹配到正则表达式,如果能正确匹配则返回true,否则返回false。
var reg = /ab/g;
var str = "ababababab";
console.log(reg.lastIndex); //0
console.log(reg.exec(str)); //"ab"
console.log(reg.lastIndex); //2
console.log(reg.exec(str)); //"ab"
console.log(reg.lastIndex); //4
console.log(reg.exec(str)); //"ab"
console.log(reg.lastIndex); //6
console.log(reg.exec(str)); //"ab"
console.log(reg.lastIndex); //8
console.log(reg.exec(str)); //"ab"
console.log(reg.lastIndex); //10
console.log(reg.exec(str)); //null
可以看到每执行一个exec(),lastIndex就会改变一次,exec表示每次只匹配一个,一直循环。如果不写"g"的话,则返回值全是0。
9.支持正则表达式的字符串方法
方法 | 含义 |
---|---|
search | 检索与正则表达式相匹配的值。 |
match | 找到一个或多个正则表达式的匹配。 |
replace | 替换与正则表达式匹配的子串。 |
split | 把字符串分割为字符串数组 |
search方法:返回值是stringObject 中第一个与 regexp 相匹配的子串的起始位置
var reg = /ab/g;
var str = "AB abababab";
console.log(str.search(reg)); //3 不包含空格
match()方法:返回值是所有能匹配到的字符串
replace方法:
replace(“a”,“b”): replace “a” with “b”.
var str = "aabb";
console.log(str.replace("a","b")); //babb 只能替换一个
这时,replace表示用b替换字符串中的a。但是只能替换第一个
replace的参数还可以是正则表达式,如果是正则表达式的话就表示按正则表达式查找符合规则的字符串并进行替换。
var str = "aabb";
var reg = /(\w)\1(\w)\2/;
console.log(str.replace(reg,"$2$2$1$1")); //["bbaa"]
替换值也可以写成一个函数:
var str = "aabb";
var reg = /(\w)\1(\w)\2/;
console.log(str.replace(reg,function($,$1,$2){
return $2+$2+$1+$1;
})); //["bbaa"]
看题: 将the-first-name形式的改成小驼峰式theFirstName
var str = "the-first-name";
var reg = /(-\w)/g;
console.log(str.replace(reg,function($,$1){
return $1.toUpperCase();
}));