JavaScript 正则表达式
正则表达式API:
http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin
什么是正则表达式?
正则表达式(Regular
Expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
简单来说:使用特定的符号所描述的一种规则,通常被用来检索、替换那些符合某个模式(规则)的文本
举例:
用户名只能输入 数字、字母、下划线 ,同时数字不可以作为开头,同时长度必须在6-20之间
var str = username; if( /^[a-zA-Z]\w+$/.test(str) ){ //符合规则 }
为什么要使用正则表达式?
最主要的是可以大量的节省验证的工作量,正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
如何创建正则表达式?
第一种:
var reg = new RegExp("google", "gi");
第二种使用 /regstr/gi:
/google/gi.test(str)
reg 代表了一种规则
reg.test("xxxx") 代表了使用该规则对字符串进行校验
字符串的match方法
var pattern = /good/ig; var str = 'good good study!,day day up!'; console.log(str.match(pattern)); console.log(str.match(pattern).length);
使用 search 来查找匹配数据
var pattern = /good/ig; var str = 'good good study!,day day up!'; console.log(str.search(pattern));
使用 replace 替换匹配到的数据
var pattern = /Good/ig; var str = 'good good study!,day day up!'; console.log(str.replace(pattern, 'hard'));
日期处理
"2017&08&08".replace(/\d+\D/g, function(matched, index, str){ //matched : 【2017&,08&】 //index : 【0,5】 return ""; //返回内容将替换匹配内容 }) "2017&08@08".replace(/(\d+)(\D)/g, function(matched, sub1,sub2, index, str){ console.log(matched, sub1, sub2); //【2017&,2017, &】【08@,08,@】 return sub1+"-"; }) "2017&08@08".replace( /\D/g , "-" );
DOM选择器
function $$(selector) { if(selector === undefined) return; var match = null; //#id if(match = selector.match(/^#(.+)/)) { return document.getElementById(match[1]); } //.class if(match = selector.match(/^\.(.+)/)) { return document.getElementsByClassName(match[1]); } //div if(match = selector.match(/^([a-zA-Z]+[0-9]?)$/)) { return document.getElementsByTagName(match[1]); } //div[index = 1] if(match = selector.match(/^([a-zA-Z]+[0-9]?)\[(.+)\=(.+)\]/)) { console.log(match); var eles = Array.from(document.getElementsByTagName(match[1].trim())); var res = eles.filter(function(item, index, arr) { return item.getAttribute(match[2].trim()) == match[3].trim(); }); return res; } }
日期显示
setInterval(function(){ var nowstr = new Date().toLocaleString(); var res = null; var reg = /\d/g; var arr = []; while(res = reg.exec(nowstr) ){ arr.push(res[0]); } console.log(arr) },1000) setInterval(function(){ console.log( new Date().toLocaleString().match(/\d/g) ); },1000)
. 表示任意字符
var pattern = /g..gle/; var str = 'google'; console.log(pattern.test(str));
匹配次数问题
* 表示任意次 0 或多次
? 表示匹配1次或0次
+ 表示至少1次
{m,n} 表示m次到n次
{m,} 表示至少m次
{m} 表示匹配m次
字符匹配
[a-zA-Z0-9] 列举所有符合的情况,当情况过多时,使用-表示范围
^ 开始
$ 结束
\d 数字
\D 非数字
\w 数字字母下划线
\W 非数字字母下划线
\s 空白字符
校验是否全由数字组成
正则表达式验证数字
/^[0一9]*$/ 或 /^\d+$/ function isnumber(num) { if(typeof num == "string" || typeof num == "number"){ return /^\d+$/.test(num); } else { throw new Error("参数类型错误!,必须为数字或字符串"); } }
校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
var reg = /^\+?(\d+-?)*\d+$/;
检查邮政编码 //共 6 位数字,第一位不能为 0
/^[1-9]\d{5}$/
检查文件压缩包 //xxx.zip\xxx.gz\xxx.rar\xxxx.7z\xxx.tar
/^.+\.(zip|gz|rar|7z|tar)$/
删除多余空格 //
删除首尾空格
str.replace( /\s+/g , "");
str.replace( /(^\s+)|(\s+$)/, "")
电子邮件( xxxxx @ xxxx(.xxxx)+)
/^[^@\s\?]+@[^@\s\?]+(\.[^@\s\?]+)+$/
手机号 1 3|5|8|7|4
/^1(3|5|8|7|4)\d{9}$/
身份证
/\d{17}[0-9X]/
日期 (xxxx-xx-xx| xxxx/xx/xx | xxxx.xx.xx)
/\d{4}([-_\.#\s]\d{2}){2}/
匹配中文
[\u2E80-\u9FFF]
账户名只能使用数字字母下划线,且数字不能开头,长度在6-15之间
/^[a-zA-Z_]\w{5,14}$/
article.replace( /\sb[aeio]g\s/, " bug ");
将所有方法foo(a,b,c)的实例改为foo(b,a,c)
code.replace( /foo\(([^,]+),([^,]+),([^,]+)\)/, function(matched, g1, g2, g3){ return "foo("+g2+","+g1+","+g3+")"; } )
假设有一个多字符的片断重复出现,例如:
Billy tried really hard
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"
str.replace(/(really\s)+/g,"very ");
敏感词过滤
function strfilter(target) { var words = ["SB", "TMD", "WQNMLGB", "GCD", "89.64"]; for(var i in words) { var reg = new RegExp(words[i], "gi"); var stars = ""; for(var k = 0; k < words[i].length; k++) { stars += "*"; } return target.replace(reg, stars); } }