正则表达式是规定字符串中字符出现规律的规则。一般用于查找、验证、替换、切割字符串。

1. 正则表达式基本语法:
  1. 备选字符集:
一个备选字符集,只能规定一位字符,用[]括起来,例如:[abc],[a-z]          
  表示除别字符外所有字符均可:^除掉字符
  1. 预定义字符集:对常用字符集的简写方式
\d: 1位数字 [0-9]
  \w: 1位数字,字母或下划线 [0-9a-zA-Z_]
  \s: 1位空字符:空格 tab 回车换行
   .: 1位任意字符,除回车换行外
  1. 数量词:规定一个字符集出现次数的量词,紧跟字符集之后,修改相邻的前一个字符集
    1. 确定数量(3种):
{m,n} 最少m个,最多n个  
  {m,}  m个以上  
  {m}   必须m个

2.不确定数量(3种):

?: 可有可无,最多一个
  *: 可有可无,多了不限
  +: 至少一个,多了不限
  1. 选择和分组:
分组: (子表达式)
选择:或   表达式1|表达式2
手机号:(\+86|0086)?\s*1[34578]\d{9}
身份证号:15位数字,2位数字,从数字、x、X中选一个,后两部分整体可有可无,最多一次
        \d{15}(\d\d[0-9xX])?
  1. 指定匹配位置:
^:开头位置的xxx,专用在表达式开头
$:结尾位置的xxx,专用在表达式结尾
比如:^\s+ 匹配开始位置的所有空字符
     \s+$ 匹配结尾位置的所有空字符
     ^\s+|\s+$ 匹配开头或结尾的空字符
前加^后加$(不带|):表示从头到尾完整匹配,只要验证格式,都要前加^,后加$

补充:汉字的备选字符集:[\u4e00-\u9fa5]

2. String中支持正则的API:
  1. 查找(4种):
  1. var i=str.indexOf/lastIndexOf("敏感词"[,fromi])
  • 缺点:不支持正则表达式,只能找位置,每次只能找一个敏感词
  • 优点:可指定开始查找的位置
  • 何时使用:敏感词固定时,且仅获得位置时
  1. var i=str.search(/正则表达式/)——如果没找到返回-1
  • 缺点:不支持后缀g,加上也会被忽略;仅返回找到的第一个关键词的位置;不能设置开始位置,无法循环找所有关键词位置;无法返回关键词内容。
  • 优点:支持正则
  1. var arr=str.match(/正则表达式/g) 如果没找到返回null,先判断不是null,才继续使用,返回值:[关键词1,…]
    默认正则表达式只匹配一个关键词,表达式后+g,让表达式匹配所有关键词
  • 缺点:不加g时不支持设置开始位置,返回值:[0:关键词,index:下标];无法获得每个关键词的位置。
  • 优点:可返回所有匹配关键词的内容
  1. var arr=reg.exec(str);
  • 特点:既可获得关键字内容,又可获得位置;每次只能找下一个敏感词,自动调整下次开始的位置。 如果找到返回一个数组对象:数组的第一个元素保存本次找到的敏感词内容,数组的index属性保存本次找到的敏感词的位置。
  1. 替换:var newStr=str.replace(/正则表达式/g,"替换内容")
  • 删除:将匹配内容替换为""
  • 格式化(2步):
  • 先定义正则表达式,用()分组,每个(),都会得到一个序号:1,2,…
  • 在replace中的替换内容部分,使用$n拼接结果,匹配时,会自动将$n换成本次匹配的实际内容
    比如: var birth="19831226";birth=birth.replace(/(\d{4})(\d{2})(\d{2})/,"$1年$2月$3日");
  1. 切割:var arr=str.split(/分隔符正则表达式/);
    切割结果不包含切割符本身,将字符串打散为字符数组–> var chars=str.split("");
  2. 验证:var bool=reg.test(str);
    强调:只要验证,必须前加^,后加$,表示从头到尾完整匹配
    str符合reg的规则,就返回true,否则返回false
3. RegExp对象:正则表达式对象

封装了一个正则表达式,提供了操作正则表达式的方法

  • 创建正则表达式(2种):
  1. 创建固定正则表达式对象:var reg=/正则表达式/g;
  • 何时使用:如果正则表达式不需要动态生成时
  1. 创建可变正则表达式对象:var reg=new RegExp("正则表达式","后缀");
  • 何时使用:如果正则表达式由变量或字符串动态生成时
  • 强调:所有\都要写成\。比如:”\d{6}”–>”\d{6}”
    后缀:g: 全局/全部, i: 忽略大小写
  • 正则表达式对象的方法(2种):
  1. 查找的第四种方法:var arr=reg.exec(str);

强调:exec每次查找都会重置arr数组内容,上次查找的内容被替换,如果没找到,返回null!
反复查找:

var arr=null;
  while((arr=reg.exec(str))!=null){
      arr[0]; //关键字的内容
      arr.index; //关键字的位置
  }