最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等


什么是 RegExp?

  • RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配。
  • 通常用于格式验证、正则替换、查找子串等
  • RegExp入门:w3school 在线教程
  • 完整的 RegExp 对象参考手册:JavaScript RegExp 参考手册


// 直接实例化
var reg = new RegExp(pattern , flags);

// 隐式创建(推荐)
var reg = /pattern/flags;

参数 pattern 是一个字符串,指定了正则表达式的模式。

参数flags是一个可选字符串,包含属性 g/global 、i/ignoreCase和 m/multiline。



正则表达式test(),慎用g修饰符

按道理两次打印出来都应该是true,true,而最终结果为true,false

var reg = /^[0-9][0-9]{1,2}$/g
console.log(reg.test('12')) //true
console.log(reg.test('12')) //false

 g表示全文查找,正则表达式内部有一个lastIndex来记录匹配的位置,第一次调用test()后,那么lastIndex就不再等于0,而是2。解决方法:

在第二次使用前,设置reg.lastIndex=0即可

var reg = /^[0-9][0-9]{1,2}$/g
console.log(reg.test('12')) //true
reg.lastIndex=0
console.log(reg.test('12')) //true

g修饰符,使用match匹配验证正则表达式 

var reg = /^[0-9][0-9]{1,2}$/g
console.log(!!'12'.match(reg)); //true
console.log(!!'12'.match(reg)); //true

 m修饰符-多行匹配

var reg = /^[0-9][0-9]{1,2}$/mg
str='12\n12'
console.log(str.match(reg)) //['12', '12']

子表达式-查找连续相同的四个数字

  • 在正则表达式中,使用括号括起来的内容是一个子表达式,子表达式匹配到的内容会被系统捕获至缓冲区,使用\n(n:数字)来反向引用系统的第n号缓冲区的内容。

  • 场景:后面的内容要求与前面的一致,可以使用子表达式

// 查找连续相同的四个数字
var str = "1212ab45677778cd";
var reg = /(\d)\1\1\1/gi;
console.log(str.match(reg));//7777

概念:方括号(字符簇)

  • [abc] 查找方括号之间的任何字符。
  • [^abc] 查找任何不在方括号之间的字符。
  • [0-9] 查找任何从 0 至 9 的数字。同 \d
  • [a-z] 查找任何从小写 a 到小写 z 的字符。
  • [A-Z] 查找任何从大写 A 到大写 Z 的字符。
  • [A-z] 查找任何从大写 A 到小写 z 的字符。
  • [0-9a-zA-Z]
  • (red|blue|green) 查找任何指定的选项。
var str = "Is this all there is?";
var patt1 = /[a-h]/g;
document.write(str.match(patt1));
// OUTPUT:h,a,h,e,e

概念:元字符

元字符(Metacharacter)是拥有特殊含义的字符:
- \ 转义符 (、)、/、\
- | 选择匹配符,可以匹配多个规则
- . 查找单个字符,除了换行和行结束符。
- \w 查找单词字符。字符 ( 字母 ,数字,下划线_ )
- \W 查找非单词字符。
- \d 查找数字。
- \D 查找非数字字符。
- \s 查找空白字符。空格
- \S 查找非空白字符。
- \b 匹配单词边界。
- \B 匹配非单词边界。
- \0 查找 NUL 字符。
- \n 查找换行符。
- \f 查找换页符。
- \r 查找回车符。
- \t 查找制表符。
- \v 查找垂直制表符。
- \xxx 查找以八进制数 xxx 规定的字符。
- \xdd 查找以十六进制数 dd 规定的字符。
- \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。\u00A9 匹配 符号 (?)



概念:量词

  • n+ 匹配任何包含至少一个 n 的字符串。同 {1,}
  • n* 匹配任何包含零个或多个 n 的字符串。同 {0,}
  • n? 匹配任何包含零个或一个 n 的字符串。同 {0,1}
  • n{X} 匹配包含 X 个 n 的序列的字符串。
  • n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
  • n{X,} 匹配包含至少 X 个 n 的序列的字符串。
  • n$ 匹配任何结尾为 n 的字符串。
  • ^n 匹配任何开头为 n 的字符串。注意 /[^a]/ 和 /^[a]/是不一样的,前者是排除的意思,后者是代表首位。
  • (?=n) 匹配任何其后紧接指定字符串 n 的字符串。正向预查
  • (?!n) 匹配任何其后没有紧接指定字符串 n 的字符串。反向预查




test()

test() 方法检索字符串中是否存在指定的值。返回值是 true 或 false。

var patt1 = new RegExp('e');
console.log(patt1.test('some text'));
// OUTPUT:true

var patt2 = new RegExp('ee');
console.log(patt2.test('some text'));
// OUTPUT:false

// 判断是不是QQ号 // 1 首位不能是0 ^[1-9] // 2 必须是 [5, 11] 位的数字 \d{4, 9} var str = '80583600'; var regexp = /^[1-9][0-9]{4,10}$/gim; if (regexp.test(str)) { alert('is'); } else { alert('no'); }

exec()

exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

var patt1 = new RegExp('e');
console.log(patt1.exec('some text'));
// OUTPUT:e

var patt2 = new RegExp('ee');
console.log(patt2.exec('some text'));
// OUTPUT:null





compile()

compile() 既可以改变检索模式,也可以添加或删除第二个参数。

var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); // true

// 改变了检索模式
patt1.compile("eee");
document.write(patt1.test("The best things in life are free")); // false





支持正则表达式的 String 对象的方法





search 检索与正则表达式相匹配的值。

var str = "Visit W3School!"
console.log(str.search(/W3School/))
// OUTPUT:6





match 找到一个或多个正则表达式的匹配。

var str="1 plus 2 equal 3"
console.log(str.match(/\d+/g))
// OUTPUT:1,2,3
111
// 找重复项最多的字符个数

var str = 'g21ss4aeba_ersb43sgnnsssstht6sss60snnsj8resw0_ss';

// split : 将字符串转化为数组
// sort : 对数组排序,ASCII
// join : 将数组转化为字符串
var str_new = str.split('').sort().join('');
document.write(str + '<br>');
document.write(str.split('') + '<br>');
document.write(str.split('').sort() + '<br>');
document.write(str.split('').sort().join('') + '<br>');

// 匹配字符,且重复这个字符,重复次数至少一次。
var regexp = /(\w)\1+/g;

var index = 0;
var value = '';

str_new.replace(regexp, function($0, $1) {
    // document.write($0);
    // document.write($1); 
    if (index < $0.length) {
        index = $0.length;
        value = $1;
    }
});

document.write('重复项最多的字符是:' + value + ',个数是:' + index);


// OUTPUT:
// 0012344668__aabbeeegghjnnnnrrssssssssssssssssttw
// 重复项最多的字符是:s,个数是:16

split 把字符串分割为字符串数组。

var str = "Is this all there is?";
var patt1 = /[a-h]/g;
document.write(str.match(patt1));
// OUTPUT:h,a,h,e,e

  1. 检验格式(邮箱格式、IP格式)是否正确,用test()
  2. 抓取星期(如所有手机号),用exec()、match()
  3. 替换敏感词汇,用replace





常见的 正则表达式 校验

var myRegExp = {  

    // 检查字符串是否是数字 var reg = /^\d+$/;

    // 去掉前后空格
    trim: function(str) {
        var reg = /^\s+|\s+$/g;
        return str.replace(reg, '');
    },

    // 检查字符串是否存在中文 var reg = /[\u4e00-\u9fa5]/gm;

    // 检查字符串是否为合法日期格式 yyyy-mm-dd
var reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/;

}

// 测试
// console.log(myRegExp.trim('  100  '));

.。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值