正则表达式Regex

111 阅读3分钟

正则表达式Regex

正则表达式是一个学了立马就会忘的东西,所以我们需要多多复习。

正则表达式可以精准匹配你想要的字符组合,从而使文本处理更加高效灵活。在我们日常很多场景中都可以看到正则表达式的身影,比如大量笔试题,网站注册中的邮箱格式,电话号码格式,以及在IDEA或VScode中,Ctrl+R以及Ctrl+F也支持正则表达式的高级搜索(记得打开正则模式的开关)。

RegExr: Learn, Build, & Test RegEx,这是一个正则表达式练习的网站,非常好用

修饰符

/([A-Z])\w+/g

正则表达式一般是被两个斜线//包裹起来的,后面可以加上一些修饰符。上面的g代表global,全局匹配的意思。接下来的示例中将省略修饰符和斜线。

直接匹配

apple像这样的直接输入字母或数字,那么将会直接匹配文本中的对应字段。这也是正则表达式唯一的匹配方式。

.代表除换行符以外的任意字符。比如app..将会匹配任意以app开头,且后面跟了两个字符的字符串。

^代表开头,如对于^Ra,代表开头后第一个字符为R,且后一个字符为a的文段。

$代表结尾,如对于aR$代表结尾前的一个字符为R,且再之前一个字符为a的文段。

想要匹配一定范围内的单个字符,那么就需要一个表达式了。这个表达式需要被中括号[]包裹起来。

[]表达式

一一列举

对于[]内的字符,可以理解为一个“或”的关系。比如[ab123]代表字符a,b,1,2,3,这几个字符都可以被匹配的意思。

范围运算符 -

除了一一列举之外,还可以使用[a-zA-Z1-3]来表示从a到z的小写字母,A到Z的大写字母以及1到3都可以被匹配。

取反运算符^

如果想要对某一范围取反,在这个范围前加上^即可。例如[^a-z]表示所有非小写字母的字符。不过注意了,^运算符的优先级很低,会在最后结算。它会将其右侧的整个表达式看作一个整体,然后取反。

\表达式

指转义,对于上文提到的`.^$`等。如果需要匹配这些特殊字符,我们需要将它转义,在它之前加上

除此之外,如果我们想要匹配数字,那每次都需要写[0-9]是非常麻烦的。除了[]外,正则表达式直接提供了\d表示数字字符。\D则表示非数字字符。\w代表字母数字下划线,类似的,大写取反。\s代表空白字符,也就是空格和Tab,大写取反。\b代表单词边界。

量词

量词,顾名思义就是用来表示重复次数的。比如我们想要匹配a后有一个或多个t的字符串,那就可以在t后面加上一个加号at+,这个+表示前面的一个字符重复了1+次。如果是at?,代表t重复了0或1次。如果是at*,则表示t重复了0+次。

除此之外,还可以用{n}表示指定的重复次数。n代表重复的次数。比如at{3}就完全等价于attt。如果使用范围即{n,m},则代表重复次数n到m均可以被匹配。如果m为空(,存在),则m代表无上限。

量词的匹配模式为贪婪匹配,什么意思呢?也就是匹配的字符串尽可能长。存在字符串attt和正则表达式at{1,2},那么最终匹配结果为att而不是at。如果在量词后面加上?变为at{1,2}?,那么匹配模式将会变成非贪婪模式。此时结果为at。

量词运算会先于正则表达式中的字符连接运算。也就是说,如果我们想要匹配多个atat连在一起的情况,我们需要给at加上括号,也就是分组,再在后面加上量词。

如果想要表达“或”,那么直接在表达式中间加上|即可。也就是[Pp]attern等价于(P|p)attern

分组

刚刚已经提到了分组的概念。实际上,一个括号就是一个分组。所以分组也可以被嵌套。那么把组分好了有什么用呢?定义运算优先级是括号的工作,而分组的概念则另有妙用:正则表达式中,组号会以左括号出现的次序依次被升序分配。例如第一个最左侧的左括号所在的分组将会被记为$1,然后第二个记为$2

每组有了自己的id后,就可以使用Replace功能重组一个新的字串。

正则表达式中,可以使用``+一个数字来代表分组。例如我们想要匹配一个单词,这个单词第一个字母和最后一个字母相同才行。那么可以使用正则:\b(a-z)[a-z]*\1\b

如果不想要某一个括号被分组的话,在左括号后面加上?:即可。

前瞻后顾

有些时候,我们需要匹配一个文段,这个文段的前/后需要满足一定的条件。那么我们可以在其原本文段的前/后加上特定的匹配规则。这个匹配规则需要被括号包裹。如果是前瞻,在左括号后面加上?=即可。取反则使用?!。如果是后顾,则使用?<=,取反则使用?<!。这也叫0宽断言,这样的括号不会被视为组。