1 前言
正则表达式是一个非常通用的概念,任何语言都有其对应的实现。
比如c++中就有一个类为regex,使用方法可以参照本站的另一篇文章:正则表达式。
本文并不探讨具体的使用方法,而是探讨正则表达式是什么,它的作用以及常见的用途。
2 什么是正则表达式?
正则表达式是一种用于描述和匹配字符串模式的方法。它是一种强大而灵活的工具,广泛应用于文本处理、搜索和替换等操作中。
简而言之,它是一种处理字符串的工具,而且是一个非常强大的工具。
正则表达式本身也是一串字符串,只不过组成正则表达式的字符有其特殊含义,比如,规范中就是用\d来表示匹配一个数字的。
所以学习正则表达式,主要就是学习正则表达式的规范而已,但想要真正使用,你还得学习具体编程语言对应的库。
比如C++实现正则表达式的库就是regex。
3 理解正则表达式规范
根据文法类型的不同,不同正则表达式其实也有一些细微的差别。
比如C++中的regex库默认使用的文法就是ECMAScript文法。
但老实说,大部分正常情况下,你是无需考虑这些差异的,因为基本的东西都是通用的。
比如匹配:10010这个字符串中的所有数字。
最直接的方式就是你不使用任何正则表达式特殊字符,直接就用字符串10010来匹配即可。
但数字在正则表达式中是有对应的字符可以匹配的:\d。
因此上面的10010其实还可以换成:\d\d\d\d\d,意思就是匹配字符串中的五个数字。
这就一下子通用了起来,因为它不再仅仅可以匹配10010,而是可以匹配任意五个数字的组合:11111,33333,10101…等等。
但这样写太麻烦了,所以我们还有匹配次数的语法:\d{5},它等价于上面的五个\d。
如果你觉得\d记不住,麻烦,那你还可以使用中括号的方式:[0-9]{5},意思就是0-9中的任意数字,匹配5个。
这种[]用法是最常用的,因为它不仅仅只能匹配数字,还可以匹配字母、甚至汉字:
[a-zA-Z0-9正则表达式]{5}
上面这句话的意思就是,可以匹配小写字母、大写字母、数字0-9、以及正则表达式这五个汉字中任意一个字符5次。
是不是有点感觉了?
想要完全学习正则表达式,给大家推荐一个免费好用的网站:Regex Learn
这个网站就是带你从0开始,一步一步学习正则表示式全部语法的。
虽然其网站模式使用的JavaScript语言中的正则表达式语法,比如/[0-9]{5}/g,外面的//g就是JavaScript中,但其本质思想都是一样的。
只要你学会了基本思想、语法,其它语言也不过是换了个写法而已。
最后再列举我最常用的几个语法:
- .:匹配任意字符
- *:匹配0次或多次
上面的两个一般就可以组合匹配任意奇怪的内容。
比如我们要匹配有两个大括号中的内容:{vav哈哈ae**&&%%tr},但大括号中的内容是任意的。
那么就可以写成:{.*}
更多时候,我们还想要取出大括号中的内容,那么就用小括号将其包裹起来:{(.*)}。
这被称为捕获组,对应的编程语言中都会有相应的语法可以让你将小括号中的内容给取出来。
举个实际的例子,我想要获取一堆文件的文件名(带后缀名),无论的文件名还是文件的后缀名都是多种多样的,但中间的点(.)是不变的。
那么就可以写为:(.*)\.(.*)
这里就要注意了,因为.在正则表达式中已经有了任意字符的含义,所以想要让它拥有本意,则需要用符号\将它还原。
这和C/C++中\符号作用有些类似,只不过这里是还原,C/C++中使用\是转义。
这样就能通过编程语言库中的具体函数分别取出文件名与后缀名,非常的方便!
4 常用符号
最后,再列举一些常用的正则符号。
首先是已经被正则表达式使用的符号,也被称为元符号:
| 元字符 | 含义 | 
|---|---|
| . | 任意单个字符(除换行) | 
| ^ | 匹配开头 | 
| $ | 匹配结尾 | 
| * | 0 次或多次重复 | 
| + | 1 次或多次重复 | 
| ? | 0 次或 1 次重复 / 非贪婪 | 
| ` | ` | 
| () | 分组 | 
| [] | 字符集合 | 
| {n,m} | n 到 m 次重复 | 
| \ | 转义 | 
| 如果你想要使用这些符号,就需要用 /对它们进行转义。 | 
然后是一些常用的、字符匹配的符号:
| 表达式 | 含义 | 
|---|---|
| \d | 数字( [0-9]) | 
| \D | 非数字 | 
| \w | 单词字符(字母数字下划线) | 
| \W | 非单词字符 | 
| \s | 空白符(空格、\t、\n 等) | 
| \S | 非空白符 | 
| \b | 单词边界 | 
| \B | 非单词边界 | 
