es6学习3:正则梳理

前言:  

  简单理解正则, 大致从这几个方面

  [ 1: 创建形式  2: 元字符和转义字符  3:  数词量词  4:  分组  5: 修饰符  6:常用方法 7: 附加功能 

一、创建形式

// case 1:
var reg1 = /a/g;     // 为正则边界
// case 2:
var reg2 = new RegExp(/a/g);   // 与上一个不同的是方便把变量生成为正则条件
// case 3:
let reg3 = new RegExp(/a/,'g'); // es6专用

二、元字符和转义字符

  .................元字符.................

  \t  => tab 水平制表符

  \v => 垂直制表符 (不太清除干嘛用的, 有研究的朋友可以回复下~)

  \n => 换行

  \r  => 回车换行符 (不太请拿出\r\n的区别, 只知道linux和windows下有些差异, 并且\r是相当于敲了了个回车, \n还记得html中中肿么用的嘛~)

  \0 => 空字符 

  \f  => 换页  (没用到过不敢说)

  \cx =>对应ctrl+x (没用到过不敢说)

   .................常见转义字符.................

  

三、数词 量词 边界控制

  正则的使用经常伴随着如下模式 / (数词)(量词) / (修饰)  如 var reg =  /a{5}/gi;

  .................数词.................

  case 预定义类型:

    \w   => 匹配字母或数字或下划线或汉字 等价于 '[A-Za-z0-9_]'。

    \s   => 空格

    \d   => [0-9]

    \u{xxxx} => 直接键入unicode编码

  case 非预定义类型:

    /avenda/   => 对应avenda单词 

    /1234/      => 对应1234

    /\.\\\?\-/     => 对应.\?-

  case 类对象 (占一个位置, 内部为所有满足条件的条件):

    [\dabc] => 数字或者abc

  case 非与或:

   (1|2|3) => 1或2或3 等同于[123]  //'或'一般结合分组使用

   [^\d] =>非数字  // '非'一般用于类对象中, 如果不是在类对象中则表示以xx开始

  case 条件断言 (跟在一个正则单元后面判断是否满足条件):

   (?= xxx)  例: 'AvendaAvenda2333'.replace(/avenda(?=\d)/ig,'X')  这里是把后面为数字的avenda替换为X字母, i修饰符为忽略大小写

  .................量词.................

  量词表达出现的数量, 跟在量词后面做循环判定

    ? => 最多1次    例: /a?/ 最多出现一次a或者没有

    + => 最少1次    例: /a+/ 至少出现1次

    * => 任意次数     例: /a*/

    {n} 出现n次      例: /a{3}/出现3次

    {n, m} 出现n到m次    例: /a{2,3}/出现2或3次

    {n, } 至少出现n次    例: /a{2,}/至少出现2次

    {0, n}  最多出现n此    例: /a{0,3}/最多出现3次

  .................边界控制.................

  \b  匹配单词边界    例:  'this is'.replace(/\bis\b/,'X') => 

  \B    匹配非单词边界 例: 'this is'.replace(/\Bis\b/,'X') => 

  ^  行头, 放在类元素[] 里表示 '非'

  $  行尾 

四、分组 ( '(xxx)' )

  为什么要用分组?...

  情景1 :

    var reg = new RegExp('(^|&)age=([^&]*)($|&)');
  // 分组1   :(^|&)      => 开头为行首或者'&'
  // 默认分组2 : 'age='    => 切出匹配'age=的元素'
  // 分组3   :([^&]*)     => 若干个不是字符'&'的元素, 换言之, 遇到字符'&'则停下来
  // 分组4   :(&|$)      => 以字符'&'或者行尾结束 reg.exec(
'name=avenda&age=15');

  output: 

    

  请看数组2元素, 是了, 就是为了拿到age的值

  那么 ... 拿name的值呢?

 var reg = new RegExp('(^|&)name=([^&]*)($|&)');
 reg.exec('name=avenda&age=15');

  output:

  

  结论1: 我们可以利用分组借助exec或者match方法去把数据划分为数组片段, 从而拿到我们需要的值,

  每一个分组都可以形成一个数组元素

 情景2 :


var str = '666hahaAvenda';
var reg = /(\d{3})(\w{4})(\w{6})/i;
str.replace(reg,
'$3$1$2');

  output:

  

  结论2: 分组后, 每个分组元素会对应 $1 $2 $3 变量, 可以通过变量来进行增删改

五、修饰符

  / /     没修饰符时, 匹配到一个后停止, 不会再继续进行匹配

  / /g     全局匹配, g修饰符时, 会一直匹配直到没有满足条件的元素位置

  / /y     全局匹配-黏连模式, y修饰符时, 匹配完第一个满足元素后, 第二个满足元素必须紧挨着第一个元素, 中间有任何元素哪怕一个空格也会停止匹配

  / /i   忽略大小写

  / /m   多行匹配(受换行符影响)

  / /u  对unicode超过0xFFFF的字符支持, 如 /\u{20BB7}/.test('𠮷') -> false  /\u{20BB7}/u.test('𠮷') -> true

  例: /a/gi  => 匹配所有a元素忽略大小写

六、常用方法

  正则本身方法:

    exec(str)

      特性: 会返回结果数组

    test(str)

      特性; 会返回boolean

  字符串方法:

    str.replace(reg, newStr)

    str.match(reg)

      特性: 受全局g修饰符比较大

      扩展: 循环match

var regex = /t(e)(st(\d?))/g; //注意一定要加g, 不然会无限循环
var string = 'test1test2test3';

var matches = [];
var match;
while (match = regex.exec(string)) {
  matches.push(match);
}

 

七、附加说明

  对象属性:

    例子: var reg = /a/gi ;    

    reg.lastIndex      连续匹配时候, 匹配元素的坐标  => 0-n

    reg.source    连续匹配时候, 匹配元素的坐标  => a

    reg.flags     正则修饰符           => gi

  贪婪模式与非贪婪模式

    贪婪模式(默认)   '12334444'.replace(/\d{3,6}/,'X')   => 

    费贪婪模式(尽可能少的匹配, 尾部加?) '12334444'.replace(/\d{3,6}?/,'X')  => 

    推荐一些不错的工具和文档

    正则解析(知道自己打的正则匹配含义):  https://regexper.com/#%0A

    正则匹配测试: https://regexr.com/

    转载一个常用正则: https://www.cnblogs.com/myTerritory/p/6855932.html

    es6的一些api: http://es6.ruanyifeng.com/#README

   一些坑:

    1. '.'不可以代表任意字符, 如果unicode编码大于2个字符则.失效  应对: 加u修饰符

    2. ^非的话一定要写在[]里

  

posted @ 2018-12-07 14:26  颜繁达  阅读(324)  评论(0编辑  收藏  举报