正则表达式————呱呱二号

1、正则的创建

  两种方法:

let reg = new RegExp('box','ig');  //通过创建对象
let reg1 = /box/ig;  //字面量表示法
typeof reg;  //Object
typeof reg1;  //Object

  字符模式修饰符:

  i:忽略大小写

  g:全局匹配

  m:多行匹配

  常用方法:

  test:匹配成功返回true,失败false,

  exec:成功返回数组,失败null

  使用方法,正则.test('字符串');正则.exec('字符串');

  例子:

let reg = new RegExp('box','ig);
reg.test('This is a box');  //true

2、字符串的正则匹配方法,String对象提供的四个正则表达式的方法(一直没有搞明白以下的方法【replace,match,search,split】的使用,为什么和【test,exec】的使用方式不一样,今天总算明白了)。

  replace:用replacement替换pattern

  match:返回pattern中的子串或null

  search:返回字符串中pattern开始的位置

  split:返回字符串按指定pattern拆分的数组

 

  'Guaguaerhao'.match(/gua/ig);  //返回['Gua','gua']

  'Guaguaerhao'.replace(/gua/ig,'yi');  //替换并返回替换后的字符串,第二个参数为替换的元素

  'Guaguaerhao'.search(/gua/ig);  //返回匹配的位置,找不到返回 -1

  'Guaguaerhao'.split(/gua/g);  //返回拆分后的字符串,并组成数组 ['Gua','erhao']

 

3、正则的静态属性(不常用,而且浏览器兼容做得不是很好)

  input:用于匹配的字符串

  leftContext:匹配正则的字符串的前面的字符串

  rightContext:匹配正则的字符串的后面的字符串

  lastMatch:最后一次匹配的字符串

  lastParen:最后一次匹配圆括号的字符串

  

  let pattern = /gua/;

  pattern.test('Guaguaerhao');  //必须要先执行一次,才能使用静态属性,另外静态属性还有短名

  RegExp.input;  //Guaguaerhao  

  RegExp.leftContext;  //Gua

  RegExp.rightContext;  //erhao

  RegExp.lastMatch;  //gua

  RegExp.multiline;  //是否开启多行匹配

 

4、正则的实例属性(就是实例对象的属性)

  global:Boolean,表示是否已设置全局

  ignoreCase:Boolean,表示是否设置不区分大小写 

  multiline:Boolean,是否开启多行匹配

  source:String,实例属性的源字符

  

      let pattern = /google/mgi;

  pattern.global;  //true

  pattern.ignoreCase;  //true

  pattern.multiline;  //true

  pattern.source;  //google    

 

  //以上章节内容没有多大用处,纯长长见识

5、字符

  一、字符类:单个字符和数字

  . :任意字符

  [a-zA-Z0-9]:匹配括号中任意一个字符

  [^a-zA-Z0-9]:匹配除括号中任意一个字符    //^在中括号中代表 非 ,^如果紧接着/,就是匹配开头

  \d:匹配数字

  \D:匹配非数字

  \w:匹配字母和数字及 _

  \W:匹配非字母和数字及 _     //和\w相反

  二、重复字符

  x?:一个或零个x

  x*:0,1或更多x

  x+:至少1个x

  (xyz)+:匹配至少一个xyz

  x{m,n}:匹配m~n个x

  仨、替代字符

  this | where | there :匹配this或where或there中的任意一个

  四、锚元字符匹配

  ^:匹配开头

  $:匹配结尾

  \A:只有匹配字符串开始处

  \b:匹配单词边界,词在[]内无效    //这个不太懂

  \B:匹配非单词边界  

  \Z:匹配字符串结束或行尾

  \z:匹配字符串结尾处

  五、空白字符

  \0:匹配null字符

  \b:匹配空格字符

  \n:匹配换行符

  \r:匹配回车字符

  \t:匹配制表符

  \s:匹配空白字符,空格,制表符和换行符

  \S:匹配非空白字符

  六、记录字符  

  (string):用于反向引用的分组    //感觉这个比较难理解

  \1或$1:匹配第一个分组的内容

  \2或$2:匹配第二个分组的内容

  以此类推……

  栗子:

  let pattern = /google{2,3}$/i;

  let str = 'googleee';

  let str1 = 'googleeee';

  pattern.test(str);  //true

  pattern.test(str1);  //false

  //注意对比与上一个的区别

  let pattern = /(google){2,3}$/i;

  let str = 'googlegooglegoogle';

  let str1 = 'googlegooglegooglegoogle';

  pattern.test(str);  //true

  pattern.test(str);  //false

  

  let pattern = /2(.*)2/i;

  let str = '2haha2';

  pattern.test(str);

 

  RegExp.$1;  //表示获取模式中第一个分组对应的匹配字符串

6、贪婪,惰性

  贪婪  惰性

  +    +?

  ?     ??

  *     * ?

  {n}   {n}?

  {n,}     {n,}?

  {n,m}  {n,m}?

 7、分组之后使用exec返回字符串数组

  let pattern = /([a-z]+)\s([0-9]{4})/;

  let str = 'google 2018';

  let arr = pattern.exec(str);  //返回一个数组,length为3

  console.log(arr[0]);  //返回第一个字符串为,匹配的整个字符串

  console.log(arr[1]);  //返回第一个分组为,匹配的第一个分组匹配的字符串

  console.log(arr[2]);  //返回第二个分组为,匹配的第二个分组匹配的字符串

 

  捕获性分组

  let pattern = /(\d+)([a-z])/;  //这个叫做捕获性分组,所有的分组都捕获

  let str = '123str';

  let arr = pattern.exec(str);

  arr[0];  //返回123str

  arr[1];  //返回123

  arr[2];  //返回str

 

  非捕获性分组(在不需要捕获的分组左括号后,添加 ?: )

  

  let pattern = /(\d+)(?:[a-z]{3})/;

  let str = '123abc';

  let arr = pattern.exec(str);  //length为2

  arr[0];

  arr[1];

 

  总结:就是匹配到的分组,如果是自己需要的话,就将其返回(捕获),不需要的分组就可以不返回(不捕获|非捕获),都是根据自己的需求来写。

8、嵌套分组(分组的延伸)

  let pattern = /(a(b(c)))/;

  let str = 'abc';

  let arr = pattern.exec(str);  //["abc", "abc", "bc", "c", index: 0, input: "abc"];    index,input是实例属性

  arr.length;  //4

  arr[0];  //abc

  arr[1];  //abc

  arr[2];  //bc

  arr[3];  //c

 

 9、前瞻性捕获

  let pattern = /goo(?=gle)/;  //goo后面必须是gle才能返回goo,这里注意,返回的是goo,而不是google

  let str = 'google';

  alert(pattern.exec(str));  //返回的是goo,而不是google,这是前瞻性捕获

10、匹配正则里面的特殊字符,使用反斜杠  

  let pattern = /\[/;  //假如要匹配左中括号 [   ,要使用反斜杠转义

  let str = '[nihao]';

  pattern.test(str);  //true

 

 

分类不是很对,将就看着吧。

 

 

 

  

posted @ 2018-01-04 13:18  呱呱二号  阅读(173)  评论(0编辑  收藏  举报