文章开始前推荐一下正则表达式在线编辑器:RegExr: Learn, Build, & Test RegEx
一、修饰符
正则表达式的具体表达一般位于两个“/”之间,如"/[A-Z]/g",其中“[A-Z]”便是主要内容,而最后一个“/”后的“g”字符则是修饰符的一种,用于辅助表示正则表达式的作用域或者作用方式。类似的常用修饰符如下所示:
g --> global,表示作用于全域
i --> case insensitive / ignore,表示不区分大小写
m --> multi-lines,表示多行匹配(许多正则编辑器默认多行)
s --> 允许特殊字符.匹配到换行符
第一章节后的输入示例均省略'/'与修饰符。
二、单点匹配
1.精准匹配
在正则表达式编辑器中输入“a”,便可以精准匹配到文本中全部的字符‘a’所在处,若输入“ab”则会匹配到文本中全部的子串“ab”所在处。
2.范围匹配
在正则表达式编辑器中还可以通过中括号“[ ]”来实现范围性的匹配。若输入“[ab]”,意为“匹配字符‘a’或字符‘b’ ”,可以匹配到文本中字符‘a’或者‘b’的全部所在处。还可以输入“[a-z]”用以匹配任意的小写字母,输入“[A-Z]”匹配任意的大写字母。
此外,如同逻辑表达式中的“非”一样,正则表达式1也提供多种多样的“非”的表达形式,在中括号“[ ]”中可以通过添加字符“^”来实现,如"[^a-z]"可以匹配到所有的非小写字母的字符。
在不使用中括号时也可以实现“或”逻辑,那便是最经典的字符“|”,如输入“is|are”便可以匹配到所有的子串“is”和子串“are”的所在处。
3.默认分类
为了简化读写,正则表达式中不乏一些默认的、规范化的表述方式,大致如下所示。
. --> 能够匹配到单个任意字符(换行符除外)
\d --> 匹配任意单个数字,等价于[0-9]
\D --> 匹配任意非数字字符,等价于[^0-9]
\w --> 匹配任意字母数字下划线字符,等价于[A-Za-z0-9_]
\W --> 匹配任意非\w可以匹配到的字符,等价于[^A-Za-z0-9_]
\s --> 匹配任意空白字符,如空格、缩进符、换行符
\S --> 匹配任意非空白字符
三、量词与贪婪匹配
1.量词
正则表达式中引入了许多量词的用法,从而更符合使用逻辑,也减少了书写正则表达式的工作量。具体的量词含义如下。
* --> 匹配0次或者多次前面的元素
+ --> 匹配1次或者多次前面的元素
? --> 匹配0次或者1次前面的元素
{n} --> 确切匹配n次前面的元素
{n,} --> 匹配n次或更多次前面的元素
{n,m} --> 匹配n次到m次前面的元素
如在编辑器中写入“is{2}”,便只能匹配到字符串“iss”而不能匹配到“is”。那如果想要匹配到“isis”或者“isisis”等等要怎么做呢?我们可以用接下来第四章节提到的分组匹配来实现。
2.贪婪匹配
量词后面加上字符'?'即表示此次为非贪婪匹配,满⾜匹配条件之后,即使后⾯依然符合条件也不会再继续匹配了。
{n,}? --> 匹配n次前面的元素。此时{n} = {n,}? = {n,m}?
四、分组匹配
1.分组并捕获
通过小括号“( )”可以实现分组捕获,进而得到更加复杂的正则匹配。如“(is)”便是将“is”视作一个整体来处理,这便是分组。而捕获则更多用于数据提取和数据替换等操作。如下图输入“/(n)(a[a-z])/gm”便可以得到数个匹配的子串,光标移到子串上便可以查看到详细的信息,其中group #1、group #2便是我们使用小括号进行分组的结果,之后我们便可以使用“$1”与“$2”分别对匹配到的字符“n”和子串“an”、“ag”等进行操作处理,这便是捕获。
2.分组但不捕获
通过在输入"(?:xxx)"可以实现对正则内容xxx的分组,但是并不会对其进行捕获,也就是不会通过$符号引用到xxx所匹配到的内容。
五、定位符
符号'^'在中括号中表示匹配逻辑“非”,但在中括号外部则表示后跟的正则所匹配到的位置在行首。例如:“^Hello”匹配以“Hello”开始的行。
符号'$'在捕获中起到了一种类似于“引用”的效果,在正则表达式中则表示匹配到行尾,与‘^’相对应。例如:“World$” 匹配以“World”结尾的行。
符号“\b”表示匹配边界。例如,“\bin\b”就会精确确匹配单词“in”,而不会匹配单词“find”中的“in”。符号“\B”则表示匹配非单词边界,例如“\Bin\B”就完全不会匹配到单词“in”。