常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式

1、正则仅仅就是用来处理字符串的:匹配、捕获

匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则)
捕获:在整个字符串当中,把符合规则的字符都依次的获取到--->exec、match、replace

2、正则的组成:元字符、修饰符

元字符:

特殊意义的元字符:

\d匹配一个0-9的数字相当于[0-9],和它相反的
\D匹配一个除了0-9的任意字符相当于【】 
\w匹配一个0-9、a-z、A-Z_ 的数字或字符,相当于[0-9a-zA-Z_]  、
\s匹配一个空白字符(空格、制表符。。。)
\b匹配一个单词的边界 “w100 w000”
\t匹配一个制表符
\n匹配一个换行
. 匹配一个除了\n以外的任意字符
^ 以某一个元字符开头
$ 以某一个元字符结尾
\ 转译字符
x|y  x或者y的一个
[xyz] x、y、z、中的任意一个
[^xyz]除了x、y、z、中的任意一个
[a-z] -> 匹配a-z中的任意一个字符
[^a-z] -> 匹配除了a-z中的任意一个字符
() 正则中的分组

量词:

*  0到多个
+  1到多个
?  0到1个

?在正则中的意义比较多

放在一个非量词元字符后面代表出现0-1次  例如/^\d?$/出现0-9直接的数0到1次

放在一个量词元字符后面,取消捕获时候的贪婪性  /^\d+?$/捕获的时候只是把第一个捕获的数字获取 "2015"--->2
    (?:)分组值匹配不捕获
    (?=)正向预查
    (?!)负向预查

()的作用
1)改变默认的优先级
2)可以进行分组捕获
3)分组引用

{n}出现n次
{n,}出现n到多次
{n,m}出现n到m次

普通元字符

任何字符在正则中除了以上有特殊意义的,其他的都是代表本身意思的普通元字符

修饰符:

i:忽略字母的大小写
m:multiline 多行匹配
g:global全局匹配

项目中经常使用的正则

1)判断是有效数字的正则

有效数字是指:正数、负数、零、小数

第一部分:可能出现加减或者没有
第二部分:一位数可以是0,多位数不能以0开头
第三部分:可以有小数也可以没有小数,但是一旦出现小数点,后面至少跟一位数字
var reg =/^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;

有效的正整数(包含0):/^[+]?(\d|[1-9]\d+)$/;

有效的负整数(包含0):/^-(\d|[1-9]\d+)$/;

判断手机号(简单版):
var  reg=/^1\d{10}$/;

判断邮箱
第一部分:数字、字母、下划线、- 一到多位
第二部分:@
第三部分:数字、字母、 一到多位
第四部分:(.两到四位) .com   .cn   .net   ..      .com.cn
var reg =/^[0-9a-zA-Z_-]+@[0-9a-zA-Z-]+(\.[a-zA-Z]{2,4}){1,2}$/

判断年龄在18到65之间的
18-19/20-59/60-65
var  reg =/^((18|19)|([2-5]\d)|(6[0-5]))$/

真实有效的中华人民共和国姓名 2-4 位汉字
var reg = /^[\u4e00-\u9fa5]{2,4}$/;

身份证号码
前六位是省->市->县(区)
四位年 两位月 两位日

简单版

var reg = /^\d{17}(\d|X)$/;
    130828199012040617

复杂版

var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;

细节知识点

里面出现的任何字符都是代表本身意义的,例如:[.]中的”.“就是代表一个小数点而不是除了\n以外的任意字符
里面出现18不是数字18而是1或者8,例如[18-65]是1或者8-6或者5中任选一个

1、exec正则的捕获方法--->先匹配,然后把匹配的内容捕获

如果字符串没有匹配这个正则,捕获的返结果是null

如果和正则匹配,返回的结果是一个数组

例子
var str ="2015zhufeng2016peixun"
var reg = /\d+/;

第一项是我们捕获的内容

index:捕获的内容在元字符串中开始的索引位置
input:捕获的原始字符串

2、正则的捕获是懒惰的

正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容
  解决办法:添加全局修饰符g--->加上g后,第一次捕获完成后,lastIndex的值发生了改变,变为第一次捕获内容后的第一个字符的开始索引,第二次捕获是继续向后查找的...
  疑问:不用全局修饰符g每次捕获完成后手动修改lastIndex的值不可以么?
不可以,虽然手动修改了lastIndex,确实把lastIndex的值进行改变了,但是正则查找的时候还是从索引0开始的

var str = "zhufeng2015peixun2016";
  var reg = /\d+/g;

例子

为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g

RegExp.prototype.myExecAll = function myExecAll() {
    var _this = this, str = arguments[0], ary = [], res = null;
    !_this.global ? _this = eval(_this.toString() + "g") : null;
    res = _this.exec(str);
    while (res) {
      ary[ary.length] = res[0];
      res = _this.exec(str);
    }
    return ary;
  };
  var ary = reg.myExecAll(str);
  console.log(ary);
    console.log(reg.lastIndex);//->0
    var res = reg.exec(str);
    console.log(res);
    console.log(reg.lastIndex);//->11
    res = reg.exec(str);
    console.log(res);
    console.log(reg.lastIndex);//->21
    res = reg.exec(str);
    console.log(res);//->null

3、match:捕获字符串中存在一个叫做match的方法也可以实现捕获,而且只要我们取消了正则的懒惰性,执行一次match方法就可以捕获到所有内容了

  var str = "zhufeng2015peixun2016";
  var reg = /\d+/g;
  console.log(str.match(reg));

疑问:那我们都用match来替换exec多好啊?

4、正则的分组捕获

每一次捕获的时候,不仅仅可以把大正则匹配的内容捕获到,而且还可以把每一个小分组(子正则)匹配的内容单独的捕获到

    var str = "zhufeng[2015]peixun[2016]";
    var reg = /\[(\d)(\d+)\]/g;
    var res = reg.exec(str);
    console.log(res);
    ["[2015]", "2", "015", index: 7, input: "zhufeng[2015]peixun[2016]"]

第一项是大正则捕获的内容 res[0]
第二项是第一个分组捕获的内容 res[1]
第三项是第二个分组捕获的内容 rex[2]
。。。。。

分组的只匹配不捕获:我们如果执行把分组内容进行匹配但是不进行捕获的话,只需要在分组的前面加上?:即可

  var str = "zhufeng[2015]peixun[2016]";
   var reg = /\[(?:\d)(\d+)\]/g;
   var res = reg.exec(str);
   console.log(res);
   ["[2015]", "015"...]

数组中的第一项是大正则捕获的内容 res[0]
      数组中的第二项是第二个分组捕获的内容 res[1]
      第一个分组添加了?:,所以只匹配不捕获

5、exec和match的区别

match只能捕获大正则匹配的内容,对于分组捕获中,是无法获取分组匹配的内容的,所以如果捕获的时候不需要捕获分组的内容,我们直接用match更方便,如果需要捕获分组的内容,我们只能使用exec来一个个捕获

var str = "zhufeng[2015]peixun[2016]";
  var reg = /\[(\d+)\]/g;
  //console.log(str.match(reg));//->["[2015]", "[2016]"]
  var ary = [];
  var res = reg.exec(str);
  while (res) {
    //ary.push(res[1]);
    ary.push(RegExp.$1);//RegExp.$1获取当前正则第一个分组捕获的内容,(可能在部分IE浏览器下捕获不到值)
    res = reg.exec(str);
  }
  console.log(ary);

6、正则的贪婪性:在每一次的捕获的时候,总是按照正则匹配的最长结果捕获

var str = "zhufeng2015peixun2016";
    var reg = /\d+/g;
    console.log(reg.myExecAll(str));//-->["2015","2016"]
  var str = "zhufeng2015peixun2016";
  var reg = /\d+?/g;
  console.log(reg.myExecAll(str));//-->["2", "0", "1", "5", "2", "0", "1", "6"]

7、分组引用

\2代表出现和第二个分组一模一样的内容

\1代表出现和第一个分组一模一样的内容

var reg=/^(\w)(\w)\2\1$/;
  "woow"、"1221"...

8、字符串方法---->replace:把一个字符串中的某个字符替换成新的内容

1)在不使用正则的情况下

执行一次replace只能替换字符串中的一个,需要替换多个同样需要执行多次

var str = "zhufeng2015 zhufeng2016";
  "zhufeng" -> "珠峰"
  str = str.replace("zhufeng", "珠峰").replace("zhufeng", "珠峰");

有些时候即使执行多次,也实现不了替换

  "zhufeng" -> "zhufengpeixun"
  str = str.replace("zhufeng", "zhufengpeixun").replace("zhufeng", "zhufengpeixun");

[第一个参数可以是一个正则] 把所有和正则匹配的内容进行替换(但是和捕获一样默认是懒惰的,只有加上全局修饰符g才可以)

    var str = "zhufeng2015 zhufeng2016";
    str = str.replace(/zhufeng/g, "zhufengpeixun");
    console.log(str);

1)执行和执行次数问题

其实和exec捕获的原理是一模一样的

例如:我们第二个参数如果传递的是一个函数,每当正则在字符串中捕获一次当前的这个函数就执行一次 ->本题中一共捕获了两次,所以函数执行了两次

  var str = "zhufeng2015 zhufeng2016";
  str = str.replace(/zhufeng/g, function () {

2)参数问题

console.dir(arguments);
      不仅仅是执行function,而且还给我们的函数传递了参数,并且传递的参数和每一次exec捕获的内容是一模一样的
      如果是第一次exec捕获->["zhufeng",index:0,input:"原始字符串"]
      第一次执行函数里面的参数
      arguments[0] -> "zhufeng"/**/
      arguments[1] -> 0  相当于exec中的index 开始捕获的索引位置
      arguments[2] -> "原始字符串" 相当于exec中的input

3)返回值问题

return返回的是什么,就相当于把当前捕获的内容替换成什么

   return "zhufengpeixun";
  });
  console.log(str);
(0)

相关推荐

  • java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)

    java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等 复制代码 代码如下: package util; import java.util.regex.Matcher;import java.util.regex.Pattern; /** * 使用正则表达式进行表单验证 *  */ public class RegexValidateUtil {    static boolean flag = false;    static String regex = ""

  • 利用Java正则表达式校验邮箱与手机号

    主要是运用java.util.regex类. 复制代码 代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public class CheckMobileAndEmail { /** * 验证邮箱地址是否正确 * @param email * @return */ public static boolean checkEmail(String email){ boolean flag = false; tr

  • 正则表达式限制 账号 密码 邮箱 身份证 手机号的相关代码

    废话不多说了,直接给大家贴实现此功能的正则表达式代码了,具体代码如下所示: #import <Foundation/Foundation.h> int main() { // ? == {0,1} // * == {0,无穷} // + == {1,无穷} // \d == [0-9] // \w == [A-Za-z_0-9] // * 的意思是可有可无 // [a|b|c]+ 表示三个至少出现一次或多次 //检测电话号码是否正确 NSString *tel = @"";

  • 一个好用的正则匹配电话号手机号邮箱网址的方法

    找到一个好用的正则匹配电话和手机号的方法,感谢,在这里分享一下,希望可以帮助更多人 匹配全部url地址和链接内容 复制代码 代码如下: $str = "<a href='http://www.baidu.com' target='_blank'>百度</a>http://www<a href='http://www.sina.com' target='_blank'>新浪</a>kod"; preg_match_all("/&l

  • 常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式

    1.正则仅仅就是用来处理字符串的:匹配.捕获 匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则) 捕获:在整个字符串当中,把符合规则的字符都依次的获取到--->exec.match.replace 2.正则的组成:元字符.修饰符 元字符: 特殊意义的元字符: \d匹配一个0-9的数字相当于[0-9],和它相反的 \D匹配一个除了0-9的任意字符相当于[]  \w匹配一个0-9.a-z.A-Z_ 的数字或字符,相当于[0-9a-zA-Z_]  . \s匹配一个空白字符(空格.制表符

  • 正则表达式--QQ微信、优酷前端 邮箱正则表达式验证 Bug

    拿邮箱验证来说,网上绝大部分人写的邮箱验证正则表达式代码都不能验证这邮箱: i@julying.com,也不能验证 xxxxxx@i.com . 上次我发现youku.com(优酷网)用户注册就有这个问题,见图: 今天发现 QQ微信 也同样有这个问题: 他们都不能验证一个字母的域名或一个字母的用户名. 我认为,他们绝不是故意不让这样的用户注册,而是这样: 很久之前,最初写正则的程序员偷懒了,没有写 这样情况的正则表达式验证, 他当时可能觉得这样的正则比较麻烦,而且可能这样的邮箱实在太少了, 没有

  • 最常用的15个前端表单验证JS正则表达式

    在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,本文收集整理了15个常用的JavaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IPv4地址. 十六进制颜色. 日期. QQ号码. 微信号.车牌号.中文正则. 1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uP

  • 最新最全的手机号验证正则表达式

    目录 前言 各大运营商手机号码段(新) 表单字段验证常用正则表达式 总结 前言 一般表单页面都需要填写手机号,校验用户输入的手机号码是否正确,就要用到正则表达式,用正则表达式来匹配手机号段,如在运营商号段内,则号码正确.因此,需要知道运营商最新的号段,如下所示: 各大运营商手机号码段(新) 中国电信号段 133.153.173.177.180.181.189.190.191.193.199 中国联通号段 130.131.132.145.155.156.166.167.171.175.176.18

  • jQuery验证手机号邮箱身份证的正则表达式(含港澳台)

    自己对正则验证也没系统用过,这次自己做个demo,一下子把这些全都用上了,下次有需要直接来拿了. 以下代码是在页面使用JQuery进行验证的,也有在后台进行验证的,可以试试,都一样的原理. 直接上代码:注意:(有些验证规则当然不仅仅是本文的,也许还有其他更好的,可以留言交流) 手机号:(移动-电信-联通) var tel = $("#PhoneNumber").val();//获取输入的手机号 var yidongreg = /^(134[012345678]\d{7}|1[34578

  • 关于ES6新特性最常用的知识点汇总

    目录 1.关键字 2.解构 3.字符串 4.正则 5.数组 6.函数 7.对象 8.Symbol 9.集合 10.Proxy配合Reflect的观察者模式 11. Promise 12.遍历器 13.Generator 14.async 15.Class 16.修饰器 17.Moudle 总结 1.关键字 Let 关键字 在let所在的代码块中起作用.在let之前对于改该变量是不能进行赋值的 Const关键字  为只读变量,因此在定义的时候就需要去赋值. 2.解构 变量的解构, 1>.数组结构利

  • vue3组件化开发常用API知识点总结

    目录 组件化思想 组件通讯 $props $emits $parent $attrs proviede & inject 插槽 slot 渲染作用域 作用域插槽 v-model 表单组件 自定义组件 改变默认参数 样式绑定相关 class style 总结 组件化思想 为什么使用组件化开发? 当前前端比较流行的 Vue React 等框架,都会通过编写组件来完成业务需求,也就是组件化开发.包括小程序开发也会用到组件化开发的思想. 分析组件化思想开发应用程序: 将一个完整页面拆分成很多个小组件 每

  • js正则表达式之RegExp对象之compile方法 编译正则表达式

    功能说明:该方法可以编译指定的正则表达式,编译之后的正则表达式执行速度将会提高,如果正则表达式多次被调用,那么调用compile方法可以有效的提高代码的执行速度,如果该正则表达式只能被使用一次,则不会有明显的效果. 基本语法:objReg.compile(pattern[,flag]) objReg必选项,RegExp对象变量的名称 pattern 必选项 正则表达式 flag 可选项 匹配选项 复制代码 代码如下: <html> <script language="javas

  • js正则表达式之RegExp对象之compile方法  编译正则表达式

    功能说明:该方法可以编译指定的正则表达式,编译之后的正则表达式执行速度将会提高,如果正则表达式多次被调用,那么调用compile方法可以有效的提高代码的执行速度,如果该正则表达式只能被使用一次,则不会有明显的效果. 基本语法:objReg.compile(pattern[,flag]) objReg必选项,RegExp对象变量的名称 pattern 必选项 正则表达式 flag 可选项 匹配选项 复制代码 代码如下: <html> <script language="javas

  • 邮箱正则表达式实现代码(针对php)

    一直都在网上抄别人写的电话,邮箱正则表达式,今天稍微有点闲情,把一直想自己写个这样的表达式的心愿给完成: 复制代码 代码如下: /** * 邮箱地址正则表达式 */$preg = '/^(\w{1,25})@(\w{1,16})(\.(\w{1,4})){1,3}$/';$b = 'ffgddayasdadasdf@gmialsdfsdfasd3.com.cn.org';if(preg_match($preg, $b)){    echo "匹配到了";}else{    echo &

随机推荐