在处理文字的时候,你可能会遇到这样的需求:
把所有的网址找出来添加方括号。
把所有的IP地址提取出来。
找出所有类似“第xx章”的文字并进行处理。
删除所有括号中的注释内容。
…
在这些需求中,可能是爬虫程序提取某些信息,可能是notepad++处理文字,可能是Word中批量替换,相同之处是,你要处理的内容,有一定的模式,但又不是完全相同。
只要是有规律的字符串,就可以用正则表达式批量处理。
相信很多程序员或多或少都会听说过正则表达式,但是没多少人敢说自己精通。
正则表达式是非常强大的工具,然而不容易掌握,很多新手一看,这什么鬼,一脸懵逼。
其实只是对正则不了解而已,了解了你就会发现,原来就这样啊。正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,本文旨在让大家对正则有一个基本的了解,能看得懂简单的正则表达式,写得出简单的正则表达式,用以满足日常开发中的需求即可。
先来一段正则,这样的,0\d{2}-\d{8}|0\d{3}-\d{7} ,如果你对正则不了解,是不是完全不知道这一串字符是什么意思?
不要紧,文章会详细解释的。
什么是正则表达式
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。也就是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。
许多程序设计语言都支持利用正则表达式进行字符串操作。
正则表达式发展历史
正则表达式的”祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为”神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为”正则集的代数”的表达式,因此采用”正则表达式”这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
正则表达式的简单例子
runoo+b
可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
runoo*b
可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
colou?r
可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
^[0-9]+abc$
^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
^[a-z0-9_-]{3,15}$
常用于注册用户名或者密码,表示只能包含小写字母、阿拉伯数字、减号和下划线
并且长度必须不小于3不大于15
^[0-9]+abc$
匹配以数字开头,并以 abc 结尾的字符串
为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
正则表达式的规则
什么是贪婪匹配
估计就是在一次或者多次都成立的时候选择多次,尽可能长。比如coooooooool中匹配co+,那么结果可以是co也可以是coo甚至cooooooo。
贪婪匹配就是尽可能选长的。
一些在线的网站
在线匹配工具:
常用正则表达式:
https://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
教程:
https://www.runoob.com/regexp/regexp-tutorial.html
分组与捕获
https://blog.csdn.net/zx48822821/article/details/80743997
介绍
https://www.cnblogs.com/zery/p/3438845.html
https://www.cnblogs.com/pigwan7/p/7814777.html
https://www.cnblogs.com/shendaxia1/p/10755006.html
我自己常用的表达式
小说中替换广告、敏感词、网址等内容
\r\n表示换行
查看换行符,不同操作系统的换行符是不同的。
notepad++中【视图】——【显示符号】——【显示行尾符】。
我的操作系统是windows,所以行尾符是CR LF——对应的正则表达式是\r\n。
mac系统是CR——对应的正则表达式是\r。
unix系统是LF——对应的正则表达式是\n。
.+表示多个字符
\1表示前面第一个括号里面的内容
定义一段测试文本
包含各种数字、字母、网址、IP等模式。