正则表达式笔记

关于使用

1.创建一个正则
你可以使用一个正则表达式字面量:
let re = /ab+c/;
或者调用RegExp对象的构造函数
let re = new RegExp("ab+c");
2.确定一个需要被检测的部分
比如:let str = 'ababc';
\W3.检测一下这个「待测品」能否通过检验
re.test(str); //true
如果你运行一下 re.test(str); 你会得到一个true,说明「待测品」通过了测试。

元字符

\b 用于匹配一个位置,用于单词分界处
例子:\bhi\b用于查找一个单独的单词"hi";

. 用于匹配换行符外的任意字符

* 该元字符前面的内容可连续重复使用任意次
常用组合:.* 匹配任意数量不包含换行符的字符。

+ 该元字符前面的内容可连续重复使用1次或任意次

? 该元字符前面的内容可以连续重复使用0次或者1次

{n} 该元字符前面的内容可以连续重复使用n次

{n,} 该元字符前面的内容可以连续重复使用n次或更多次

{n, m} 该元字符前面的内容可以连续重复使用 n 到 m 次

\d 用来匹配一位数字
常用写法:\d{n};例如\d{2}意味着\d\d,表示匹配两位数字;\d{5}表示匹配五位数字。常用组合:\d+ 匹配一个或者多个连续的数字
同义词: [0-9]同样能匹配一位数字,和\d效果一样

\s 用于匹配任意空白符,包括空格键,tab键和换行符

\w 用于匹配 字母/数字/下划线
同义词:[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
例子:\ba\w*\b 用于匹配"a"开头的一个单词
\b\w{6}\b匹配正好6个字符的单词

^ 匹配一个开头位置
$ 匹配一个结束位置
例子:^\d{5,12}$ 匹配一个5到12位的数字

转义

当你需要查找元字符本身的话,比如你查找.,或者*等,直接查找就会出现问题,所以需要使用\来取消这些字符的特殊含义。
需要匹配 . 时,使用\.
需要匹配 * 时,使用\*
需要匹配 \ 时,使用\\

分枝条件

|分割不同的规则,满足任一种就能被匹配
例子:0\d{2}-\d{8} | 0\d{3}-d{7};能用来匹配两种格式的电话:010-12345678或者0571-1234567

分组

需要重复一段正则表达式时,需要用小括号进行分组(即:指定子表达式)
例子:(\d{1,3}){3}\d{1,3},小括号后面的{3}表示小括号内的内容重复三次。

反义

\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串

后向引用

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本,\2代表分组2匹配的文本。
例子:\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像hello hello, 或者hi hi。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

自定义组名:可以自定义组名,使用这样的语法:(?<Word>\w+)或者用'替换尖括号:(?'Word'\w+)
这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b

  • 分组0对应整个正则表达式。
  • 可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权
  • 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号。

零宽断言

(?=exp) 断言此位置之后能匹配表达式exp(零宽度正预测先行断言)
例子:\b\w+(?=ing\b) 匹配一个ing结尾单词前面的部分,比如匹配'learning'的'learn'

(?<exp) 断言此位置之前能匹配表达式exp(零宽度正回顾后发断言)
例子:(?<=\bre)\w+\b 匹配一个're'开头的单词的后面部分,比如'reading'的'ading'

负向零宽断言

(?!exp) 断言此位置后面不能匹配表达式 exp;
例子: \b\w*q(?!u)\w*\b 匹配字母'q'后面不是字母'u'的单词
备注:和表达式\b\w*q[^u]\w*\b不同的是,如果使用了[^u]则对于'q'出现在单词尾部的单词不能正常匹配,因为[^u]必须占据一位。而负向零宽断言不消费任何字符。

注释

小括号的另一种用途是通过语法(?#comment)来包含注释
例子:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

贪婪与懒惰

贪婪匹配:匹配尽可能多的字符(默认)。
例子:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串'aabab'。

懒惰匹配:匹配尽可能少的字符(只需要加上一个?)。
例子:a.*?b;匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

处理选项

/i (忽略大小写)
/g (全文查找出现的所有匹配字符)
/m (多行查找)
/gi(全文查找、忽略大小写)
/ig(全文查找、忽略大小写)

gnoreCase(忽略大小写):匹配时不区分大小写。

Multiline(多行模式):更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)

Singleline(单行模式) :更改.的含义,使它与每一个字符匹配(包括换行符\n)。

IgnorePatternWhitespace(忽略空白):忽略表达式中的非转义空白并启用由#标记的注释。

ExplicitCapture(显式捕获):仅捕获已被显式命名的组。

Comments
Write a Comment