快速正则表达式入门
正则表达式是处理文本的一个极为有效的工具,例如现在想要搜索项目中所有以 Fetch 名称开头的函数定义,那么我会使用如下的正则表达式
(?<=[\w\d_]+\s)Fetch[^()]+([^()]+)
如果看不懂这个正则很正常,让我们继续。
正则表达式确实很擅长处理文本,但是有些问题单单使用正则表达式是很难解决的(或者是使用正则表达式根本无法解决的,这是由正则表达式本身的性质决定的),并且可能就算解决了,也有可能存在性能不高,或者正则表达式非常复杂的问题。同样的有时候一个复杂的正则表达式实际上可以用两三个简单的正则表达式来替换,毕竟我们的目标是解决问题,而不是老师布置了一份必须要使用正则表达式来完成的作业。
同样在使用正则表达式时,我们必须要对我们所要处理的数据有些了解,或者说有些假设,当这些假设存在的时候,正则表达式的编写将会比较简单,或者说不会很复杂。或者你可以使用其他的方法或者另外一个正则来确定这个假设。始终要记住的是,正则表达式是文本处理的工具之一,而不是文本处理的全部。
就像一个玩笑说的:
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems.
先谈论这些当然目的不是说正则表达式没什么价值,我只是觉得在学习正则表达式以后,认识到这些问题是很有必要的。我会先将重要的东西放在前面。
我将会使用 C# 的正则做例子测试,如果你想要运行这些例子可以在 https://regex101.com/ 进行试验,记得在 FLAVOR 下面选择 .NET(好处是你可以不用处理转义字符)
元字符
abc
实际上上面的这传字符也是正则表达式,他的含义是匹配 abc (字面意思)。当然如果正则表达式只是如此,那么他和字符串的 IndexOf 方法并没有什么区别。所以首先我们需要介绍元字符。
元字符实际上就是一个转义字符,然后能够代表一些特殊的含义,例如数字,字幕,空白,以及瞄点等,我将介绍一下几个元字符,有关更多的可以参看正则元字符列表。
\w
表示字母\d
表示数字\s
表示空白\b
表示单词边界$
行尾^
行首.
任意字符?
前面的字符或组可以出现 0 -1 次+
前面的字符或者组至少出现 1 次{m, n}
前面的字符出现 m - n 次[]
代表允许方括号中的任意字符\number
引用第 number 个分组
捕获分组
捕获分组也是正则表达式的一部分,不过可以在表达式中像字符一样被重用,捕获分组用括号来标识,例如
(\w\d)+ (\w\d)\1
第一个正则表达式匹配如 a1b2c3
这样的字符串,而第二个匹配 a1a1
, b2b2
这样的。
不过要记得因为捕获分组要进行额外的统计和存储,所以如果不需要记录的分组使用 (?:)
可以减少内存占用并提高匹配速度
环视
按照方向分为左环视和右环视,按肯定否定分为肯定环视和否定环视。
左肯定环视和左否定环视 (?<=)
(?<!)
右可定环视和右否定环视 (?=)
(?!)
环视用于这样的应用场景,当想匹配一串字符,同时必须这串字符所处的环境,例如在文本
static int Fib(int number) { if (number < 3) return 1; return Fib(number-1) + Fib(number-2); }
只搜索函数定义中的 Fib 而不包含调用的 Fib,可以使用 (?<=static\sint\s)Fib
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报