正则表达式是对字符串(计算机中的字符串包含字母、数字、空格、标点符号等)操作的一种逻辑公式,就是用事先定义好的 “规则字符串”,来过滤目标字符串。这个解释不太容易看懂,举个例子就很好理解了,比方说有这么一行字符串:
libX11;lksctp;mailcap;13569,18x:Wd lsp what
我们需要对这个字符串进行分行,分行规则是所有的标点符号(含空格)前的内容都要单独成行,这个我们在复制网页文字,或者汇总多人提交数据的时候很常见(毕竟每个人的断行风格不同),那么怎么做呢,直接手工一个个断行肯定是可以的,但是第一效率太低,第二重复性工作人工的准确率是比不上程序的,我们可以这么做:
复制到notepad++中,ctrl+H打开替换框,选择正则表达式,查找内容 [;:, ]+,替换为 \n
是不是很神奇?是不是有一种想学习的冲动?那么,我们开始讲解:
查找内容 [;:, ]+ ,表示 符号 ; : ,或者 空格,出现一次或者多次
替换为 \n 表示替换为 换行
要学习正则表达式,我们就需要知道它的简单规则:
符号 | 含义 |
. | 代表除换行符外的任意字符 |
* | 匹配其左边的字符任意次 |
+ | 表示匹配一次到多次 |
? | 其左边的字符被匹配0次或者1次 |
^ | 其右边的表达式被匹配在行首。如:^Z匹配以“Z”开头的行 |
$ | 其左边的表达式被匹配在行尾。如:e$匹配以“e”结尾的行 |
() | 修改匹配规则顺序,或对匹配规则分组(标记从1开始) |
{} | 指定前面的字符或分组的出现次数 |
[] | 匹配列表中任意单个字符。如:[ab]匹配“a”或“b”;[0-9]匹配任意单个数字 |
[^] | 匹配列表之外的任意单个字符 |
\ | 转义字符 如:要使用 “\” 本身, 则应该使用\\ |
| | 匹配表达式左边和右边的字符串。如:ab|bc匹配“ab”或“bc” |
[0-9] | 匹配任意单个数字 |
\d | 匹配一个数字字符。等价于:[0-9] |
\D | \d取反,匹配一个非数字字符。等价于:[^0-9] |
\s | 匹配任意单个空白字符 [ \t] |
\S | \s取反的任意单个字符。 |
[a-z] | 匹配26个小写字母 |
[A-Z] | 匹配26个大写字母 |
\w | 匹配包括下划线的任意单个字符。等价于:[A-Za-z0-9_] |
\W | \w取反的任意单个字符。等价于:[^A-Za-z0-9_] |
\b | 匹配单词边界 |
\t | Tab制表符 注:扩展和正则表达式都支持 |
\r | 回车符CR 注:扩展支持,正则表达式不支持 |
\n | 换行符LF 注:扩展支持,正则表达式不支持 |
这里我略微又扩展了些内容:
符号 | 含义 |
^[0-9]+$ | 匹配纯数字的行 |
^\s*\r?\n | 替换所有空行 |
^{3}.$ | 前三位 |
.{3}$ | 最后三位 |
^9(.+?)1$ | 以9开头1结尾,非贪婪模式,最短匹配 |
^9(.+)1$ | 以9开头1结尾,贪婪模式,最长匹配 |
^9\d{11}$ | 以9开头,后边跟11位数字 |
$0 | 替换保留查找内容,配合()使用,$0表示保留被查找行全部内容,$1表示保留被查找行的第一个括号内容 |
解释一下\r \n,一个回车符一个换行符,其实对于大众来讲都是换行没什么区别,但是对于计算机爱好者来讲,其实也只是换行没什么区别,其主要的不同还是编码方式不同
那么什么是贪婪模式,什么是非贪婪模式呢?比方说有一串数字 1393185214,我们要查找以9开头,以1结尾的数字,如果是用非贪婪模式 9(.+?)1 匹配到的是931,如果使用贪婪模式9(.+)1 匹配,匹配到的是9318521
对于常见的正则匹配我们直接通过一个动画来演示吧
这些个都是比较普通的正则,我们看几个稍微复杂一点的
1、匹配邮箱地址
\b[A-Za-z0-9._%+-]+@[0-9A-Za-z.]+\.[A-Za-z]{2,}\b
解释: \b[A-Za-z0-9._%+-]+ 代表 左边界是 大小写字母数字下划线百分号加减号(大部分邮箱用户名是允许这些字符的)且出现一次或多次,这里需要说明的是[a-z0-9]匹配匹配的是小写字母或者数字,而不是说必须有小写字母和数字,@ 匹配邮箱地址中的 @,\. 代表邮箱中的 .,因为.是正则表达式中的特殊符号,所以要匹配就需要用到转义符号,[0-9A-Za-z.]+ 表示 分隔符左边是 数字大小写字母组合或其组合,即邮箱服务提供商 如 126、google 21CN,[A-Za-z]{2,}: 匹配两个或更多大小写字母的组合,用于匹配电子邮件地址的顶级域名部分(例如:com、net、org等)。当然了,这里只能匹配到符合邮箱格式的字符串,而不能识别字符串是否是正确的邮箱地址,如下图
它会匹配到 1、4、7、8行都是邮箱,为什么匹配不到6呢,是因为6的左边界没有字符,为什么要在8东哥后边加空格呢,因为我们限定了左边界的内容必须是数字、字母、下划线、百分号、加减号,如果没有空格,则8的左边界就不匹配了,加上空格,左边界变成了a,所以就被匹配到了。
正则表达式的强大远不止此,有对正则表达式感兴趣的友友可以和东哥一起探讨哈!