正则表达式丨入门1

首页 / 默认分类 / 正文

前言

正则表达式,英文是 Regular Expression,简称 RE。顾名思义,正则其实就是一种描述文本内容组成规律的表示方式。
在编程语言中,正则常常用来简化文本处理的逻辑。在 Linux 命令中,它也可以帮助我们轻松地查找或编辑文件的内容,甚至实现整个文件夹中所有文件的内容替换,比如 grep、egrep、sed、awk、vim 等。另外,在各种文本编辑器中,比如 Atom,Sublime Text 或 VS Code 等,在查找或替换的时候也会使用到它。总之,正则是很牛比的。

正则常见的三种功能,它们分别是:校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。

基础知识

元字符 - MetaCharacter
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。
元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
可以把元字符大致分成这几类:表示单个特殊字符的,表示空白符的,表示某个范围的,表示次数的量词,另外还有表示断言的,可以把它理解成边界限定。
元字符分类

普通字符

普通字符包括没有显式指定为元字符的所有可打印不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

非打印字符

非打印字符也是正则表达式的组成部分。下表列出了表示不可打印字符的转义序列:

字符作用
\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 \'c\' 字符。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f \n \r \t \v]。注意 Unicode 正则表达式会匹配全角空格符。
\S匹配任何非空白字符。等价于 [^ \f \n \r \t \v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊单字符

英文的点(.)表示换行以外的任意单个字符,d 表示任意单个数字,等价于 [0-9]; w 表示任意单个数字或字母或下划线,等价于 [a-z A-Z 0-9 _ ];s 表示任意单个空白符,包括空格、制表符、换页符等,等价于 [r n t f v]。
另外,还有与之对应的三个 D、W 和 S,分别表示着和原来相反的意思。即:D 表示匹配非数字字符;W 表示匹配非(字母、数字、下划线);S 表示匹配任何非空白符。

特殊单字符

元字符 \d 测试用例的链接:点击测试
元字符 \w 能匹配所有的数字、字母和下划线,测试链接:点击测试

空白符

除了特殊单字符外,你在处理文本的时候肯定还会遇到空格、换行等空白符。其实在写代码的时候也会经常用到,换行符 \n,TAB 制表符 \t 等。
不同的系统在每行文本结束位置默认的“换行”会有区别。比如在 Windows 里是 \r\n,在 Linux 和 MacOS 中是 \n。在正则中,也是类似于 \n 或 \r 等方式来表示空白符号,只要记住它们就行了。平时使用正则,大部分场景使用 \s 就可以满足需求,因为\s 代表任意单个空白符号。

空白符

\s 能匹配上各种空白符号,也可以匹配上空格。换行有专门的表示方式,在正则中,空格就是用普通的字符英文的空格来表示。

量词

上面说到的“基础”的元字符也好,“空白符”也好,它们都只能匹配单个字符,比如\d 只能匹配一个数字。但更多时候,我们需要匹配单个字符,或者某个部分“重复 N 次”、“至少出现一次”、“最多出现三次”等等这样的字符,这就需要用到表示量词的元字符了。
在正则中,英文的星号(*)代表出现 0 到多次,加号(+)代表 1 到多次,问号(?)代表 0 到 1 次,{m,n}代表 m 到 n 次。

量词

比如,在文本中“颜色”这个单词,可能是带有 u 的 colour,也可能是不带 u 的 color,我们使用 colou?r 就可以表示两种情况了。
这是 \d+ 示范用例的链接:点击测试

范围

学习了量词,我们就可以用 \d{11} 去匹配所有手机号,但同时也要明白,这个范围比较大,有一些不是手机号的数字也会被匹配上,比如 11 个 0,那么我们就需要在一个特殊的范围里找符合要求的数字。

我们要找出所有元音字母 a、e、i、o、u 的个数,这又要如何实现呢?在正则表达式中,表示范围的元字符可以轻松帮我们搞定这样的问题。在正则表达式中,表示范围的符号有四个分类,如下图所示。

范围

首先是管道符号,我们用它来隔开多个正则,表示满足其中任意一个就行,比如 ab|bc 能匹配上 ab,也能匹配上 bc,在正则有多种情况时,这个非常有用。中括号[]代表多选一,可以表示里面的任意单个字符,所以任意元音字母可以用 [aeiou] 来表示。另外,中括号中,我们还可以用中划线表示范围,比如 [a-z] 可以表示所有小写字母。如果中括号第一个是脱字符(^),那么就表示非,表达的是不能是里面的任何单个元素。

比如某个资源可能以 http:// 开头,或者 https:// 开头,也可能以 ftp:// 开头,那么资源的协议部分,我们可以使用 (https?|ftp):// 来表示。测试链接:点击测试

正则可视化工具

  1. https://regex101.com/
  2. https://tool.oschina.net/regex/
  3. http://tool.chinaz.com/regex/
  4. https://www.w3cschool.cn/tools/index?name=re
  5. https://c.runoob.com/front-end/854
  6. http://tools.haokh.net/Regex
  7. Windows 上推荐:RegexBuddy;Mac上推荐:Expressions。

在使用 markdown 语法写博客时,有可能会出现文本中的字符是 markdown 语法,那么 markdown 翻译器就会误将这些符号也翻译成某种功能,就会出现显示错误的情况。所以需要转义 /。

打赏
评论区
头像
文章目录