JS基础知识(正则表达式详解)

JS基础知识(正则表达式详解)


  • 正则表达式定义:
    1)var re = new RegExp("(^\\s+)|(\\s+$)","g"); //RegExp对象。参数就是我们想要制定的规则。
    2)var re = /(^\s+)|(\s+$)/g; // 简写方法 推荐使用 性能更好 不能为空 不然以为是注释
  • 正则的常用方法:test(),exec(),match(),search(),replace()

  • test()方法检索字符串中的指定值。返回值是 true 或 false
    用法:正则.test(字符串)
    var reg = /hello/;
    var str ="hello world";
    alert(reg.test(str)); //true
    reg.test(str);str写的是需要验证的字符串 作为参数传给test 将结果返回返回 布尔类型 只要是 含有 匹配的 返回true 否则为false

  • exec()方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null
    用法:正则.exec(字符串)
    var patt1=new RegExp("e");
    document.write(patt1.exec("The best things in life are free"));
    //返回 e

  • match()和exec()的功能一样,只是用法格式有所差别
    用法: 字符串.match(正则)
    var str = 'haj123sdk54hask33dkhalsd879';
    var re = /\d+/g; // 每次匹配至少一个数字 且全局匹配 如果不是全局匹配,当找到数字123,它就会停止了。就只会弹出123.加上全局匹配,就会从开始到结束一直去搜索符合规则的。如果没有加号,匹配的结果就是1,2,3,5,4,3,3,8,7,9并不是我们想要的,有了加号,每次匹配的数字就是至少一个了。
    alert( str.match(re) ); // [123,54,33,879]
  • search() 在字符串搜索符合正则的内容,搜索到就返回出现的位置(从0开始,如果匹配的不只是一个字母,那只会返回第一个字母的位置), 如果搜索失败就返回 -1
    用法:字符串.search(正则)
    var str = 'abcdef';
    var re = /B/i;(i表示不区分大小写)
    //var re = new RegExp('B','i'); 也可以这样写
    alert( str.search(re) ); // 1
  • replace() 查找符合正则的字符串,就替换成对应的字符串。返回替换后的内容。
    用法: 字符串.replace(正则,新的字符串/回调函数)(在回调函数中,第一个参数指的是每次匹配成功的字符)
    var str = "我爱北京天安门,天安门上太阳升。";
    var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配
    var str2 = str.replace(re,'*');
    alert(str2) //我爱**,*上太阳升
    //这种只是把找到的变成了一个*,并不能几个字就对应几个*。

    要想实现几个字对应几个*,我们可以用回调函数实现
    var str = "我爱北京天安门,天安门上太阳升。";
    var re = /北京|天安门/g; // 找到北京 或者天安门 全局匹配
    var str2 = str.replace(re,function(str){
    alert(str); //用来测试:函数的第一个参数代表每次搜索到的符合正则的字符,所以第一次str指的是北京 第二次str是天安门 第三次str是天安门
    var result = '';
    for(var i=0;i result += '*';
    }
    return result; //所以搜索到了几个字就返回几个*
    });
    alert(str2) //我爱*****,***上太阳升
    //整个过程就是,找到北京,替换成了两个*,找到天安门替换成了3个*,找到天安门替换成3个*。
  • 正则表达式基本知识点
    • 三个标志g,i,m
      g: 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
      i : 表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
      m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
      gmi:如果多个标志同时使用时,则写成:gmi
    • () [] {} 的区别
      () 的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如 (\s+) 表示连续空格的字符串。
      []是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和数字。
      {} 一般用来表示匹配的长度,比如 \d{3} 表示匹配三个数字,\d{1,3} 表示匹配1~3个数字,\d{3,} 表示匹配3个以上数字。
    • ^ 与 &
      ^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串
      & 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串
      ^ 还有另个一个作用就是取反,比如[^xyz] 表示匹配的字符串不包含xyz

      如果 ^ 出现在[ ] 中一般表示取反,而出现在其他地方则是匹配字符串的开头

    • \d \s \w .
      \d 匹配一个非负整数, 等价于 [0-9]
      \s 匹配一个空白字符
      \w 匹配一个英文字母或数字,等价于[0-9a-zA-Z]
      . 匹配除换行符以外的任意字符,等价于[^\n]
    • * + ?
      *表示匹配前面元素0次或多次,比如 (\s*) 就是匹配0个或多个空格
      + 表示匹配前面元素1次或多次,比如 (\d+) 就是匹配由至少1个整数组成的字符串
      ? 表示匹配前面元素0次或1次,相当于{0,1} ,比如(\w?) 就是匹配最多由1个字母或数字组成的字符串
    • $1 与 \1
      1)$1-$9存放着正则表达式中最近的9个正则表达式的提取的结果,这些结果按照子匹配的出现顺序依次排列。基本语法是:RegExp.$n ,这些属性是静态的,除了replace中的第二个参数可以省略 RegExp 之外,其他地方使用都要加上 RegExp 。

      //使用RegExp访问
      /(\d+)-(\d+)-(\d+)/.test("2016-03-26")
      RegExp.$1 // 2016
      RegExp.$2 // 03
      RegExp.$3 // 26
      //在replace中使用
      "2016-03-26".replace(/(\d+)-(\d+)-(\d+)/,"$1年$2月$3日")
      // 2016年03月26日

      2)\1 表示后向引用,是指在正则表达式中,从左往右数,第1个()中的内容,以此类推,\2表示第2个(),\0表示整个表达式。

      //匹配日期格式,表达式中的\1代表重复(\-|\/|.)
      var rgx = /\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}"/
      rgx.test("2016-03-26") //true
      rgx.test("2016-03.26") //false

      两者的区别是:\n只能用在表达式中,而$n只能用在表达式之外的地方。
  • 正则表达式应用:
    "^\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\d+$"    //整数
    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\d+)(\.\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil
    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码
    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址
    ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式
    ^[-+]?\d+(\.\d+)?$ //值类型正则表达式
    "^\\d+$"  //非负整数(正整数 + 0)
    "^[0-9]*[1-9][0-9]*$"  //正整数
    "^((-\\d+)|(0+))$"  //非正整数(负整数 + 0)
    "^-[0-9]*[1-9][0-9]*$"  //负整数
    "^-?\\d+$"   //整数
    "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数 + 0)
    "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
    "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数 + 0)
    "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
    "^(-?\\d+)(\\.\\d+)?$"  //浮点数
    "^[A-Za-z]+$"  //由26个英文字母组成的字符串
    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串
    "^[a-z]+$"  //由26个英文字母的小写组成的字符串
    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
    "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串
    "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址
    "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url
  • 常用正则表达式验证:
    1. 校验是否全由数字组成:/^[0-9]{1,20}$/
    2. 校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
      /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/
    3. 校验用户姓名:只能输入1-30个以字母开头的字串/^[a-zA-Z]{1,30}$/
    4. 校验密码:只能输入6-20个字母、数字、下划线/^(\w){6,20}$/
    5. 校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/
    6. 校验URL/^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的长度为length(“https://”) + n )
    7. 校验纯中文字符^[\u4E00-\u9FA5]+$/
  • 你可能感兴趣的:(js)