正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则并不是js所独有的,他是独立与任何语言之外的,很多的编程语言都支持使用正则规则对字符串进行一些复杂的操作。
正则在js中是以对象的形式存在的,和日期对象,数组对象类似
创建正则对象的方式
- 传统: new RegExp()
- 简写: //
var re1 = new RegExp('a'); //参数接收字符串,字符串:正则规则的内容
console.log(re1); /a/
var re2 = /a/;
console.log(re2); /a/
var re3 = /\d/;
console.log(re3); /\d/
*//如果使用传统的方式来创建一个正则对象,那么字符串会被默认先进行解析,然后把解析后的字符串作为参数传给正则对象
var re4 = new RegExp('\d')
console.log(re4); /d/
*//首先\d会被字符串解析成字符d,然后在把解析后的d作为参数;
var re5 = new RegExp('\\d');
console.log(re5); /\d/
var usename = 'zzaall';
*// 如果我们通过简写的形式,那么 // 中的字符是不会被js作为特殊数据解析的,比如变量,如果我们的正则中有通过变量来表示的内容,那么简写的方式就不适合了
var re6 = /usename/;
console.log(re6); /usename/
var re7 = new RegExp(username)
console.log(re7); /zzaall/
正则.test(字符串)
检测参数字符串中是否包含有正则对象所匹配的内容,如果有返回true,如果没有就返回false
console.log(/\d/.test('abc1degfg')) //true
\d: 一个数字
字符串.search(字符串/正则)
查找参数的内容在前面字符串中首次出现的位置,如果没有返回-1.和indexOf很类似,但是他和indexOf有一个最大的区别是:indexOf参数只支持字符串,search还可以支持正则
console.log('abcde'.search('a')); 0
console.log('abcde'.search('b')); 1
console.log('abcde'.search(/a/)); 0
console.log('a2bcde'.search(/\d/)); 1
console.log('bacds'.search(/A/i)); 1
console.log('bacds'.search( new RegExp('A', 'i') )); 1
i: ignore 忽略 大小写
修饰符: 对正则表达式内容的强调与说明
字符串.match(正则)
在前面的字符串中查找和参数匹配的内容,并保存到一个数组中返回
var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d/) ); // 2 一个数组,保存第一个数字出现
console.log( str.match(/\d/g) );// 2,3,4,2,4,2,4,2,1所有数字的数组
模式:
- 懒惰: 如果使用懒惰模式进行内容匹配,那么当找到一个匹配结果的时候,就终止继续执行
- 非懒惰: g : global 全局查找,修饰符
var str = 'j234hj2g42jh4j2k1';
console.log( str.match(/\d+/g) ); //234,2,42,4,2,1
+: 表示+的前一个规则最少匹配一次,最多不限,量词
模式:贪婪:当一组结果中的内容有多个满足的时候,正则会选择最大化的结果作为最终结果
字符串.replace(要查找的内容, 要替换的内容)
在前面的字符串中查找第一个参数指定的内容,并用第二个参数的内容进行替换
console.log('asdasda'.replace('a','*')); //*sdasda
*/简单的字符串替换,只会替换一次,如果我们需要进行一些更为复杂的查找和替换,那么就需要使用正则来进行
console.log( 'asdasda'.replace(/a/gi, '*') ); //*sd*sd
replace
- 第一个参数:既可以接收普通的字符串,也可以接收正则对象
- 第二个参数:既可以接收普通的字符串,还可以接收一个函数(回调)
敏感词替换
//我们可以根据当前这次匹配的内容长度来动态的返回不同个数的*
var str = '西红柿是红色的';
var newStr = str.replace(/西红柿|红色/g,function(a){;
console.log(a); //西红柿 红色
var s = '';
for(var i = 0;i < a.lenfth;i++){
s += '*'
}
return s;
});
console.log(newStr);
//***是**的
子项
var d1 = '2017-7-17';
function formatDate(str){
return str.replace(/(\d+)\D+(\d+)\D+(\d+)/,function($0,$1,$2,$3){
// 第一个参数($0):当前整个正则所匹配的内容,后面的参数是每个()里的内容
console.log($0); //2017-7-17
console.log($1); //2017
console.log($2); //7
console.log($3); //17
return $1 + '年' + $2 + '月' + $3 + '日';
})
}
console.log(formatDate(d1));
\D: 一个非数字
(): 子项; 范围(提权),会在结果中保留(提供)子项当前匹配的内容
从左至右,从外至里 也可以 根据 ( 出现的顺序来
范围选择
var str = 'a1ba2ba3baaba4b';
//a开头b结尾中间是数字 (a数字b)
console.log(str.replace(/a\db/g, '*')); ***aab*
//a开头b结尾中间是1或2或3
console.log(str.replace(/a(1|2|3)b/g, '*')); ***aaba4b
// [] 中的值是被选值,匹配其中的一个
console.log(str.replace(/a[123]b/g, '*')); ***aaba4b
console.log(str.replace(/a[123456789]b/g, '*')); ***aab*
console.log(str.replace(/a[1-9]b/g, '*')); ***aab*
console.log(str.replace(/a[a-z]b/g, '*')); a1ba2ba3b*a4b
console.log(str.replace(/a[A-Z]b/g, '*')); a1ba2ba3baaba4b
console.log(str.replace(/a[a-zA-Z]b/g, '*')); a1ba2ba3b*a4b
// 匹配的是1-5或7
console.log(str.replace(/a[1-57]b/g, '*')); ***aab*
//问题:匹配1-57
/[1-9]|[1-4]\d|5[0-7]/
反向选择 ^
var str = 'a1ba2ba3baaba4ba5ba6ba7b';
// ^ 在 [] 中使用,表示反向选择的意思,只能在 [] 的开始 ,除了1 2的
console.log(str.replace(/a[^12]b/g, '*')); a1ba2b******
起始符和结束符
在正则中
^ : 字符串的起始; $ : 字符串的结尾
量词
- {n} 只能n次
- {n,} 最少n次,最多不限
- {n,m} 最少n次,最多m次
检测qq号
var qq = '200824584'
console.log(/^[1-9]\d{4,11}$/.test(qq)); true
//第一位是1-9之间的数,后面数字在4到11位之间
常用正则符号
\d : 一个数字
\D : 一个非数字
\w : 一个字符(字母数字下划线)
\W : 一个非字符(字母数字下划线)
\s : 一个空格
\S : 一个非空格
\b : 一个边界符,如果一个字母数字下划线的左侧或右侧不在是一个字母数字下划线,那么这里就会有一个符号:边界符
\B : 一个非边界符
. : 任意字符,除了换行符
重复子项
{n} : {n}表示的是一个数字 \1 \2 \3
//重复第n个子项匹配的内容
/(a)b\1/ // \1必须和第一个子项的内容是一致的
/(\d)a\1/ // \1位置上的内容必须和第一个子项的内容保持一致
var str = 'aaaaaabbbbbbjjjjjtttttttttttiiiidddd';
var n = 0;
var s = '';
str.replace(/(\w)\1+/g, function($0, $1) {
if ($0.length > n) {
n = $0.length;
s = $1;
}
});
console.log('出现次数最多的是' + s + ',一共出现了' + n + '次');
//出现次数最多的是t,一共出现了11次