正则表达式总结

304 阅读6分钟

前言:正则表达式-面试必考题呀,大家快来看看,欢迎提出新的补充哟,有问题也请大家指正! 参考的某大佬博客:www.cnblogs.com/myitnews/p/…

1.什么是正则表达式?

一种文本规范,包括普通字符(a-z等)和特殊字符("元字符");
正则表达式使用单个字符串来描述,匹配一系列、匹配某个句法规则的字符串;
正则表达式用途:
    1.基于模式匹配从字符串中提取子字符串;
    2.替换文本;
    3.测试字符串内的模式;

2. 正则表达式基本知识

构造方法:用多种元字符与运算符,将小的表达式结合创建更大的表达式;
正则表达式组件:单个字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合;

2.1 普通字符

  [abc]:匹配[...]中所有字符;
  [^abc]:表示除了[...]中字符的所有字符;
  [a-z]:匹配一个区间,匹配所有小写字母;
  . :匹配除换行符(\n,\r)之外的任何单个字符,类似于[^\n\r];
  [\s\S]:匹配所有,\s是匹配所有空白符,包括换行,\S非空白符,包括换行;
  \w:匹配字母、数字、下划线,等价于[A-Za-z0-9];

2.2 非打印字符

  非打印字符的转义序列:
      1. \f:匹配一个换页符 ~\x0c和\cL;
      2. \n:匹配一个换行符 ~\x0a和\cJ;
      3. \r:匹配一个回车符 ~\x0d和\cM;
      4. \s:匹配任何空白字符,包括空格、制表符、换页符等。~[\f\n\r\t\v],unicode
      正则表达式会匹配全角空格符;
      5. \S:匹配任何非空白字符。 ~[^ \f\n\r\t\v];
      6. \t:匹配一个制表符, ~\x09和\cI;

2.3 特殊字符

  一些有特殊含义的字符,当匹配时,首先使字符"转义",即:反斜杠\放在前面;
      1. $:匹配输入字符串的结尾位置。若设置了regexp的multiline属性,$也匹配'\n''\r',匹配$本身,使用\$;
      2. ():标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用,匹配这些字符使用\(和\);
      3. *:匹配前面的子表达式0次或多次,匹配*时,使用\*;
      4. +:匹配前面的子表达式一次或多次,匹配+时,使用\+;
      5. .:匹配除换行符\n之外的任何单字符,匹配.时,使用\.;
      6. []:标记一个中括号表达式的开始,匹配[时,使用\[;
      7. ?: 匹配前面的子表达式0次或1次,或指明一个非贪婪限定符,匹配?时,使用\?;
      8. \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。如'n'匹配'n','\n'匹配换行符,序列'\\'匹配'\','\('匹配'(';
      9. ^: 匹配输入字符串的开始位置,例外:在方括号表达式中使用时,表示不接受该方括号表达式中的字符合集,匹配^时,使用\^;
      10. {}:标记限定符表达式的开始,匹配{时,使用\{;
      11. |:指明两项之间的一个选择,要匹配|,使用\|;
      12. /[^]/这种情况表示非

2.4 限定符

  限定符定义:用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
  包含以下6种:*, +,?, {n},{n,},{n,m};
   1. *:匹配前面的子表达式0次或多次,匹配*时,使用\*;
   2. +:匹配前面的子表达式一次或多次,匹配+时,使用\+;
   3. ?: 匹配前面的子表达式0次或1次,或指明一个非贪婪限定符,匹配?时,使用\?;
   4. {n}:n是一个非负整数,匹配确定的n次,例'o{2}'不能匹配'Tomy'中的o,可以匹配'mood'的两个o;
   5. {n,}: n是一个非负整数,至少匹配n次。例'o{2}'不能匹配'Tomy'中的o,可以匹配'moooooood'的所有o。'o{1,}'~'o+','o{0,}'~'o*';
   6. {n,m}:m和n均为非负整数,n<=m,最少匹配n次且最多匹配m次,例'o{1,3}'匹配'moooodddoood'中的前三个o。'o{0,1}'~'o?'。!在逗号和两个数之间不能有空格。
   

2.5 定位符

  定位符能够将正则表达式固定到行首或行尾。定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前后边界,\B表示非单词边界;
  定位符:
  1.^:匹配输入字符串开始的位置。若设置了 RegExp 对象的Multiline 属性,^还会与\n 或\r之后的位置匹配。
  2.$︰匹配输入字符串结尾的位置。如果设置了RegExp 对象的Multiline 属性,$还会与\n 或\r之前的位置匹配。
3.\b:匹配一个单词边界,即字与空格间的位置。
4.\B:非单词边界匹配。

!注意:不能将限定符和定位符一起使用,由于在紧靠换行或单词边界的前面/后面不能有一个以上位置,故不允许诸如 ^* 之类表达式; 匹配一行文本开始处的文本,在正则表达式的开始使用^,不要混淆中括号内表达式用法; 匹配一行文本结束处的文本,在正则表达式结束处使用$字符;

2.6 选择

 选择:用圆括号()把所有选择项括起来,相邻选择项之间用|分隔;
 ()表示捕获分组,()会把每个分组里的匹配值保存,多个匹配值可以通过数字n来查看(n是一个数字,表示第n个捕获组的内容)。
 ()缺点:使相关的匹配被缓存,可用?:放在第一个选项前来消除。
 ?:代表非捕获元之一,还有?=, ?!也是。
 ?=表示正向预查,在任何开始匹配()内的正则表达式模式的位置来匹配搜索字符串;
 ?!表示负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串;

#以下列出?=、?<=、?!、?<!的使用区别

1. exp1(?=exp2):查找exp2前面的exp1;
2. (?<=exp2)exp1:查找exp2后面的exp1;
3. exp1(?!exp2):查找后面不是exp2的exp1;
4. (?<!=exp2)exp1:查找前面不是exp2的exp1;

2.7 反向引用

对一个正则表达式模式或者部分模式两边添加(),将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中,从左到右出现的顺序存储,缓冲区编号为1-99,每个单独缓冲区可以用\n访问,n为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符,?:, ?=, ?!来重写捕获,忽略对相关匹配的保存;
反向引用的应用:提供查找文本中两个相同的响铃单词的匹配项的能力。

2.8 修饰符

标记(修饰符),正则表达式的标记用于指定额外的匹配策略,标记不写在正则表达式里,标记位于表达式之外。
常用修饰符:
    i: ignore,不区分大小写。将匹配设置为不区分大小写,搜索时不区分大小写:A和a没有区别。
    g: global,全局匹配。查找所有的匹配项。
    m: multi line,多行匹配。使边界字符^和$匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
    s:特殊字符圆点﹒中包含换行符\n。默认情况下的圆点﹒是匹配除换行符\n 之外的任何字符,加上s修饰符之后,.中包含换行符\n。

2.9 元字符

1. \ :将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,'n'匹配字符"n"'\n’匹配—个换行符。序列'I'匹配"\"而“\("则匹配"("2. ^
3. $
4. *:匹配前面的子表达式0次或多次
5. +:匹配前面的子表达式一次或多次
6. ...很多省略,参考https://www.cnblogs.com/myitnews/p/13818615.html,可以参考这篇博客,个人觉得挺不错~

2.10 运算符优先级

正则表达式计算规则:从左到右计算,并遵循优先级顺序,与算术表达式类似。
相同优先级从左到右依次计算,不同优先级按照优先级从高到低;
从高到底:

image.png

以上为总结版~,大家可以参考哟