js 正则表达式总结

1,166 阅读2分钟

正则中的小九九


正则也用了很多了,而真正自己写的正则到真是寥寥无几呀,不是粘贴复制,就是粘贴复制修改,有时候对于一些正则还不是很理解匹配的过程,觉得这作为程序员最基本的知识还是应该自己写一下正则比较好,所以重新又看了一下正则,做一下记录,以备以后自己复习和使用;

正则主要是用于操作字符串

(一)作用

  1. 验证字符串是不是合法
  2. 查找符合制定特征的字符串
  3. 替换字符串

(二)前提知识点

  1. 零宽度:子表达式匹配的仅仅是个位置,或者匹配的内容并不保存到最终的匹配结果中,就认为这个子表达式是零宽的,(其实就是表达式匹配的开始位置和结束位置是一个位置);如:"^ $ (?=xxx) (?!=xxx)"
  2. 占有字符:子表达式匹配的是字符内容不是位置,并保存在最后的匹配结果中
    var reg = /abc/; 可以认为/a/ /b/ /c/ 都是子表达式

(三)表达式

  1. 申明方式:

    1. 构造函数:
          var reg1 = new RegExp("xyz",'gi');
          //参数一:正则内容
          //参数二:修饰符;
              // i:不区分大小写;
              // g:全局匹配;
              // m:多行匹配,遇到换行符也不结束,匹配到到字符串结束;
      
    2. 字面量:
          var reg = /xyz/gi;
      
  2. 方法:

    1. reg.test() //返回true|false
          var reg = /zyx/i;
          var str="zyxaa"
          reg.test(str) // true;
      
    2. exec方法、compile方法 可以自行了解
    3. 其他使用的都是字符串的方法,不是正则方法;
  3. 匹配多字符

表达式 匹配范围 占位 表达式 匹配范围
\d 任意一个数字,0~9 中的任意一个 \D匹配取非 \W \w 任意一个字母或数字或下划线
\s 包括空格、制表符、换页符等空白字符的其中任意一个 \B匹配位置(\b 取非的位置) \b 匹配一个单词边界,一个位置:(其中一边是 "\w" 范围,另一边是 非"\w" 的范围)
. 除了换行符(\n)以外的任意一个字符 [^12A-Z]取补集 [12A-Z] 匹配中括号中的任意一个1或2或A到Z的字符
^ 匹配开始位置,不匹配任何字符 $ 匹配结束位置
| 两边表达式是或的关系 () 子表达式开始和结束的位置
1. 注意
    很多元字符在字符组内都变成了普通字符,如(^$?)等
    [.$^?]就是匹配点和$^?
    [^] ^在第一个位置时候是取补集
  1. 次数修饰
表达式 匹配范围 占位 表达式 匹配范围
{n} 重复n次 {m,} 重复至少m次数
{m,n} 重复次数在[m,n]这个范围 ? 重复0到1次 相当于{0,1}
+ 重复次数大于等于1 相当于{1,} * 重复任意次数 相当于{0,}

(四) 匹配过程

  1. 对于整个表达式来说,一般是从字符串位置0处开始尝试,中间有回溯等一些处理,如何匹配成功则返回,接着从成功之后的位置接着匹配,如何失败,就从位置1重新开始之前的匹配,以此类推,直到成功或者是匹配失败;
  2. 对于子表达式来说: 开始匹配的位置是上一个表达式匹配成功结束的位置;
  3. 例如下面匹配:

(五) 一些特殊的用法

  1. 匹配次数的贪婪与非贪婪

    1. 贪婪模式:正则默认情况是贪婪模式:在可以让整个表达式匹配成功的前提下,尽可能最多的去匹配字符串

    1. 非贪婪匹配:在匹配次数修饰符({m,n}/?+*)之后加上"?" 则在可以让整个表达式匹配成功的前提下,尽可能少的去匹配字符串;

  2. 捕获组的引用:

    1. 括号"( )"在正则中括号的作用(起到分组的效果):
      1. 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;
      2. 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到;
    2. 捕获组 : 就是把正则表达式中子表达式(括号中的表达式)匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。
    3. 引用:可以在正则表达式内部引用\number (反向引用), 也可以在正则表达式外部引用$number
      1. 引用number是和子表达式左侧括号出现的顺序相对应的
      2. 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式

  3. 正则断言(正向、负向、先行、后行)

    js中不支持后行断言,所以只介绍先行:

    1. (?=pattern) 正向先行断言 //代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。
    2. (?!pattern) 负向先行断言 //代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。

(六) 常用正则表达式

最后送上一些(个)正则表达式供大家使用
  1. 只允许字母数字下划线,必须含有大小写和数字和下划线
    var reg=/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\_)\w{8,20}$/;
  1. 银行卡四位一空格展示:
    var str="888888888888888888";
   var newStr= str.replace(/\s/g, '').replace(/(.{4})/g, "$1 ");
  1. 有趣的正则:
    var reg = /[^\w.$]/;
    reg 匹配非字母数字下划线点和$ (匹配特殊字符和中文)