正则表达式笔记
关于使用
1.创建一个正则
你可以使用一个正则表达式字面量:
或者调用RegExp对象的构造函数
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(显式捕获):仅捕获已被显式命名的组。