常用正则表达式列表

正则表达式是一种匹配模式,在日常学习或者工作中,如果善于使用正则表达式,可以大大提高效率。特别是在文本处理方面,使用正则表达式与不使用的效率可谓天壤之别。当然,如果确实没有使用的场景,了解一下正则表达式的知识点也是有好处的,可以从归纳总结的角度思考问题。本文首先概述一下正则表达式的基本知识点,再记录一些常用的正则表达式,以便查用。

正则表达式的概念

正则表达式【regular expression】描述了一种匹配字符串的 模式 【pattern】,其本身是一个 字符串 ,由 普通字符 元字符 组成。

通俗点说,正则表达式就是一种人为定义的规则,用来匹配字符串,一般有三种作用:

  • 可以检查一个字符串中是否含有某种子串,例如判断微博内容中是否包含微博话题
  • 将字符串中某种子串替换掉,例如替换微博内容中的话题为空白
  • 从某个字符串中抽取某种子串,例如从微博内容中抽取话题

正则表达式是非常简单而强大的,学会之后,除了能提高效率,还会给你带来绝对的成就感。所以,在此,要了解上面的概念并记住这几个名词: 模式 字符串 普通字符 元字符

正则表达式的入门语法

正则表达式的语法很简单,本质就是一个字符串,所以任意一个字符串就是一个正则表达式,但是为了保证这个字符串有意义、有实际用处,还是要遵循正则表达式的语法规范,下面就列举一些常见的语法规范。

基本字符

[]:中括号表达式,表示集合
():子表达式
{}:限定符表达式,用来限定次数
|:多个选项中的一个,即或的逻辑关系,满足其一即可
.:点号,表示除去换行符【\n】之外的任意字符
\:转义字符,用来转义特殊字符

定位符

^:开始位置
$:结束位置

限定符

*:匹配 0 次或多次
+:匹配 1 次或多次
?:匹配 0 次或 1 次
{n}:匹配确定的 n 次
{n,}:至少匹配 n 次
{n,m}:最少匹配 n 次且最多匹配 m 次

转义字符

除了表示特殊的字符,匹配元字符都需要使用

\r:回车符
\n:换行符
\s:匹配任何空白字符,包括空格、制表符、换页符,等价于 [\f\n\r\t\v]
\d:匹配一个数字字符,等价于 [0-9]
\w:匹配字母、数字、下划线,等价于 [A-Za-z0-9_]

普通字符

元字符之外的字符都是普通字符,即 1-4 之外的所有字符【当然,1-4 中没有列出完整的元字符】,例如标点符号、中文字、英文字母、数字等都是普通字符。

其实,平时大家都会用到的一个功能就涉及到正则表达式:在文件管理器中根据关键词搜索文件,虽然输入的只是一个普通的字符串,但是文件管理器会把它作为正则表达式来搜索,只要文件名称包含指定的字符串,就会命中【而不是说文件名一定要等于指定的字符串】。

常用模式举例

这里所说的模式,其实就是一条规范的正则表达式,具有实际的用处。

座机号码:\d {3}-\d {8}|\d {4}-\d {7,8}
网址链接:(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
微博表情【[] 里包含 1 到 8 个中文、字母】:\[[\u4e00-\u9fa5A-Za-z]{1,8}\]
微博话题:#[^@<>#"&'\r\n\t]{1,49}#,不考虑复杂情况使用 #[^#]{1,49}# 也可以
微博用户昵称【中文、数字、字母、横线、下划线的组合,2-30 个字符】:@[\u4e00-\u9fa5A-Z0-9a-z_-]{2,30}
所有的小写字母:[a-z]
所有的大写字母:[A-Z]
所有的字母:[a-zA-Z]
所有的数字、句号、减号:[0-9\.\-]
中文:[\u4e00-\u9fa5],利用了转义字符与 Unicode 编码
除了小写字母以外的所有字符:[^a-z]
除了双引号【“】和单引号【’】之外的所有字符:[^\”\']
整数:^\-?[0-9]+$
小数:^[-]?[0-9]+(\.[0-9]+)?$
一个数字:\d,或者 [0-9]
单词 yeah 连续出现一次以上:(yeah)+

其它正则表达式可以参考菜鸟工具里面的列表:https://c.runoob.com/front-end/854

在线学习网站以及使用演示

看的再多,懂得再多,不使用很快也就忘记了,所以切记:熟能生巧。下面就使用微博内容的例子来演示正则表达式的入门级别使用。

使用在线工具

1、https://tool.oschina.net/regex
2、https://regex101.com 【需要翻墙,注意程序语言的选择,选择 ECMAScript,如果使用过程中有红色填充就表示出错警告】
3、正则表达式可视化网站,帮你把正则表达式转为形象的流程图:regexper

假如有一篇微博,内容为:

1
 我分享了一张图片,来自 #腾讯动漫# 我分享了一张图片,来自 #腾讯动漫# http://t.cn/RDFUnja http://t.cn/zT8RAls //@狮鸢 LionGlede2018:[笑 cry] 哈哈哈哈哈换肚子疼 //@果子狸爬大树: [允悲]//@飞船叔叔:呵呵哈哈哈太乖了 //@Suhero-D-Ace: 笑昏 //@土豆动漫:真・睡蒙了 [允悲]//@妖妖小精: [允悲]//@M 大王叫我来巡山:这书包咋这么硬呢 [允悲][good]

演示几个匹配操作:

1、抽取微博内容中的话题:#[^@<>#"&'\r\n\t]{1,49}#
截图示例 - 抽取话题有 2 个匹配

2、抽取微博内容中的表情:\[[\u4e00-\u9fa5A-Za-z]{1,8}\]
截图示例 - 抽取表情有 6 个匹配

3、判断是否以【我分享了一张图片,来自】开头:^ 我分享了一张图片,来自.*
截图示例 - 判断以某句话开头有 1 个匹配

当然,使用 ^(我分享了一张图片,来自).* 更为准确
截图示例 - 判断以某句话开头有 1 个匹配

4、抽取微博内容中的链接:(https?|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
截图示例 - 抽取网址链接有 2 个匹配

5、抽取微博内容中的用户昵称:@[\u4e00-\u9fa5A-Z0-9a-z_-]{2,30}
截图示例 - 抽取昵称有 7 个匹配

总结

使用正则表达式之前需要先归纳总结,找到需要匹配的内容的规律,然后才能着手写正则表达式【即模式】,接着才能测试验证正则表达式是否准确。

还需要注意一点,在不同的编程语言中,对于某些特殊的字符需要转义,例如双引号、单引号、反斜杠等,还有些符号需要额外特殊处理,例如在 PHP 中,中文编码需要使用形如 \x {4e00}-\x {9fa5A} 的格式。

在文本编辑器中使用

平时处理文本文件时,有时候需要查找替换指定的内容、删除指定的内容、统计指定的内容出现的次数等等。如果这里指定的内容只是具体的字符串【例如在内容中查找:爱国敬业】,用不到正则表达式,但是如果指定的内容是一种规则,无法给出具体的表示【例如在内容中查找网址链接,并不是指某一条具体的网址链接】,那就需要正则表达式出场了。

文本编辑器推荐

1、不要使用 Windows 自带的记事本,原因:编码支持差、效率低、扩展功能弱。
举例:【联通】乱码问题、打开 11MB 大小的日志文件会卡住

2、推荐 Notepad++、Sublimetext、EmEditor 等文本编辑器
Notepad++ 官网:https://notepad-plus-plus.org
Sublimetext 官网:https://www.sublimetext.com
【打不开进镜像网站:http://www.sublimetextcn.com

3、此外还有一些收费的工具,例如:Ultraedit、EditPlus 等,不再介绍

实际演示

使用 Sublimetext 工具,继续使用上述的微博内容,操作演示,更多功能请自行探索:

1、查找替换表情,批量操作【需要开启正则模式】
查找【Ctrl + F】,或者在 查找 下拉列表中选择 查找匹配值
查找替换【Ctrl + H】,或者在 查找 下拉列表中选择 替换匹配值
SublimeText 查找替换表情

2、统计网址链接个数,在左下角可以看到命中个数【需要开启正则模式】
查找【Ctrl + F】,或者在 查找 下拉列表中选择 查找匹配值

3、打开大文件,操作流畅【打开 11MB 的 log 文件】

4、查看设置文件编码
文件 -> 保存 编码中选择

5、同时修改多处内容,Multiple Selections【Ctrl+D】

6、列模式编辑【Ctrl + Shift + L,配合 Shift 多选内容】

此外,有的版本显示文件名会乱码,显示方格,需要在 首选项 -> 设置 - 用户 中添加配置项:"dpi_scale": 1.0 ,即可正常显示。

使用 EmEditor 工具:

使用 EmEditor 打开 10 万数据量的大文件,这是一款针对 csv 文件专门设计的工具,几十万数据量不在话下,只要电脑内存够用,打开几个 GB 的 csv 文件也很轻松,而 Excel 遇到几万的数据量基本就卡住,无法操作了。

1、打开大文件,内容搜索、文件切分、编码设置

2、缺点,不能像 Excel 那么灵活进行筛选统计分析

后记

有一次遇到一个需求,使用正则表达式处理,逻辑很简单,一开始我处理时,直接写了一个嵌套很多层 .+* 等符号的正则表达式,结果出现了无限循环,电脑主机的 CPU 持续保持在 100%,十几个小时仍在匹配,这种肯定不能使用,我在另外一篇博客中有介绍:一条正则表达式引发的惨案 ,有兴趣的可以看一下。

接着我在下面列出一个看似很简单的正则表达式,但是却可以进入无限循环。

正则表达式:
^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$

匹配内容:
http://www.fapiao.com/dddp-web/pdf/download?request=6e7JGxxxxx4ILd-kExxxxxxxqJ4-CHLmqVnenXC692m74H38sdfdsazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf

虾丸派 wechat
扫一扫添加博主,进技术交流群,共同学习进步
永不止步
0%