一、概况
1、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2、正则引擎主要可以分为两大类:一种是DFA,一种是NFA。许多程序设计语言都支持利用正则表达式进行字符串操作。
二、组成
1.定界符
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
2.修饰符
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
3.方括号 代表一类字符的集合
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
4.元字符 代表一类字符的集合
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
5.量词
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
6.捕获组(子组)
() | 括号内的为子组内容 |
三、js正则使用
对象方法 var reg=new Regexp(); reg.compile(regexp,string) 编译正则表达式 reg.exec(string) 检索字符串中指定的值。返回找到的值,并确定其位置 reg.test(string) 检索字符串中指定的值。返回 true 或 false。 字符串方法 str.search(regexp) 检索与正则表达式相匹配的值。 str.match(regexp) 找到一个或多个正则表达式的匹配。 str.replace(regexp) 替换与正则表达式匹配的子串。 str.split(regexp) 把字符串分割为字符串数组。
四、例子
1、去除空格
// \s为元字符 空格, ^$为定界符 var str1=' h e l l o '; var strRe1=str1.replace(/\s*/g,''); //去除所有空格 g全局的作用 得到所有的匹配项 var strRe2=str1.replace(/^\s*|\s*$/g,''); //去除左右空格 console.log(str1.length,strRe1.length,strRe2.length);//11 5 9
2、替换指定字符
// g为全局修饰符 无替换一次 有替换所有
let str ='addtr1 23kn791addkn tr';
let nstr=str.replace(/kn/,function(v){
return '黑白kn';
})
console.log(nstr)//addtr1 23黑白kn791addkn tr
let gnstr=str.replace(/kn/g,function(v){
return '黑白kn';
})
console.log(gnstr)//addtr1 23黑白kn791add黑白kn tr
3、查找url地址
/*
?: 关闭分组的捕获功能 http :查找http s? :0个或一个s \/\/ :查找// \是转义区分表达式的开始结束 \w+ :元字符 字母数字下划线 +一个或多个 (\.\w+)*:()分组 \. 点 区分元字符所有 \w+同上 +一个或多个分组的内容 (\?\S*)?: 一个\?转义问号 /S非空格 * 0或多个 */ var reg=new RegExp(/https?:\/\/\w+(\.\w+)+(\?\S*)?/); // var reg=new RegExp(/https?:\/\/\w+(\.\w+)+/); var str3='百度http://www.baidu.com.cn?usrname=kn'; // 两个结果一样 console.log(reg.exec(str3)); console.log(str3.match(reg))
//0为全部表达式结果 1为第一个()分组 2为第二个()分组
4、查找素数
// 1111 1 false 5 // 1111 111 false 7 // 111 111 111 true 9 // 11 11 11 11 11 true 10 var str=Array(9+1).join('1'); console.log(/^(11+?)\1+$/.test(str));//判断是否为质数的正则 // console.log(str.match(/^1?$|^(11+?)\1+$/)); //(11+?) 消除贪婪 从最小范围往 大范围找 (1(1+?)) //() 捕获组 //\1 反向引用,使用第一个捕获组 var t=[]; for(var i=2;i<10;i++){ if(!/^(11+?)\1+$/.test(Array(i+1).join('1'))){ t.push(i); t.join('\t'); } } console.log(t);
5、千分位
//?=N 匹配任何其后紧接指定字符串 n 的字符串。
//?!N 匹配任何其后没有紧接指定字符串 n 的字符串。
let num='5201314' let nnum=num.toString().replace(/(?=(\d{3})+(?!\d))/g, ",");
//简化
//5,201,314 true
//52,014,14 false
//520,131,4 false
num.toString().replace( /(?=(\d{3})+$)/g, ',');
6、验证ip的合法性
1 var str="1.1.1.1;2.2.2.2;255.255.255.255;0.0.0.0" 2 function regCheckIp(val){ 3 var reg=/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ 4 var arr=val.replace(/^\s*|\s*$/g,'').split(';') 5 for(var i in arr){ 6 if(arr[i].search(reg)==-1){ 7 return true; 8 } 9 } 10 return false; 11 }; 12 regCheckIp(str)
7、获取文件后缀名
1 function validate(str){ 2 var a=str.split('.').pop(); 3 console.log(a) //txt 4 /*var d=str.match(/\.[^\.]+$/) 5 console.log(d) //[".txt", index: 8, input: "test.1.3.txt"]*/ 6 } 7 validate("test.1.3.txt")
8、模板替换 [],{{}}
/*********7、模板替换功能************************************************************/ // var reg = new RegExp("\\[([^\\[\\]]*?)\\]", 'igm'); 匹配 [] 内的内容替换 var reg = /\{\{(.+?)\}\}/g; //匹配 {{}} 的内容替换 var html="[title]--[dateA]--{{title}}---{{dateA}}" var source = html.replace(reg, function (node, key) { return { 'title': '我是hbuilder啊,哈哈哈哈', 'dateA': '2016-09-19' }[key]; }); console.log(source)