十分钟上手正则表达式 上篇

目录
  • 一、正则表达式的定义:
  • 二、正则表达式的类型
  • 三、定义 BRE 模式
    • 3.1 纯文本
    • 3.2 特殊字符
    • 3.3 锚字符
      • 3.3.1 锁定在行首
      • 3.3.2 锁定在行尾
      • 3.3.3 组合锚点
    • 3.4 点号字符
    • 3.5 字符组
    • 3.6 排除型字符组
    • 3.7 区间
    • 3.8 特殊的字符组
    • 3.9 星号【*】

一、正则表达式的定义:

正则表达式是你所定义的 模式模板 ( pattern template ), Linux 工具可以用它来过滤文本。 Linux工具(比如sed 编辑器或 gawk 程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。

正则表达式模式匹配数据:

正则表达式模式利用通配符来描述数据流中的一个或多个字符。 Linux 中有很多场景都可以 使用通配符来描述不确定的数据。【*】号在我们工作中就比较常用。

示例说明:

a.*参数会让ls命令只列出名字以a开头的文件。文件名中a之后可以有任意多个字符(包括什么也没有)。ls命令会读取目录中所有文件的信息,但只显示跟通配符匹配的文件的信息。

二、正则表达式的类型

使用正则表达式最大的问题在于有不止一种类型的正则表达式。 Linux 中的不同应用程序可能会用不同类型的正则表达式。这其中包括编程语言(Java 、 Perl 和 Python )、 Linux 实用工具(比 如sed 编辑器、 gawk 程序和 grep 工具)以及主流应用(比如 MySQL 和 PostgreSQL 数据库服务器)。正则表达式是通过正则表达式引擎( regular expression engine )实现的。正则表达式引擎是一套底层软件,负责解释正则表达式模式并使用这些模式进行文本匹配。

两种流行的正则表达式引擎:

  • POSIX基础正则表达式(basic regular expression,BRE)引擎
  • POSIX扩展正则表达式(extended regular expression,ERE)引擎

POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编程语言中。它为常见模式提供了高级模式符号和特殊符号,比如匹配数字、单词以及按字母排序的字符。awk程序用ERE引擎来处理它的正则表达式模式。

说明:

由于实现正则表达式的方法太多,很难用一个简洁的描述来涵盖所有可能的正则表达式。后面会结合sed和awk演示最常见的正则表达式。

三、定义 BRE 模式

最基本的 BRE模式是匹配数据流中的文本字符。下面会演示如何在正则表达式中定义文本以及会得到什么样的结果。

3.1 纯文本

演示说明:

模式定义了一个单词 test 。 sed 编辑器和 gawk 程序脚本用它们各自的 print 命令打印出匹配该正则表达式模式的所有行。由于echo 语句在文本字符串中包含了单词 test ,数据流文本能够匹配所定义的正则表达式模式,编辑器能显示该行。

正则表达式是区分大小写的:

演示说明:

第一次尝试没能匹配成功,因为 this 在字符串中并不都是小写,而第二次尝试在模式中使 用大写字母,所以能正常输出。

在正则表达式中,你不用写出整个单词。只要定义的文本出现在数据流中,正则表达式就能 够匹配。

演示说明:

数据流中的文本是 books ,在数据中含有正则表达式 book ,因此正则表达式模式跟数据匹配。

在正则表达式中,空格和其他的字符并没有什么区别。

演示说明:

空格的出现无法和文本内容匹配。

如果在正则表达式中定义了空格,那么它必须出现在数据流中。甚至可以创建匹配多个连续空格的正则表达式模式。

演示说明:

单词间有两个空格的行匹配正则表达式模式。

3.2 特殊字符

正则表达式识别的特殊字符包括:

.*[]^${}\+?|()

如果要用某个特殊字符作为文本字符,就必须 转义 。在转义特殊字符时,你需要在它前面加一个特殊字符反斜杠(\)来告诉正则表达式引擎应该将接下来的字符当作普通的文本字符。

示例说明:

查找文本中的美元符,只要在它前面加个反斜线。

3.3 锚字符

默认情况下,当指定一个正则表达式模式时,只要模式出现在数据流中的任何地方,它就能匹配。有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾。

3.3.1 锁定在行首

脱字符( ^ )定义从数据流中文本行的行首开始的模式。如果模式出现在行首之外的位置,正则表达式模式则无法匹配。 要用脱字符,就必须将它放在正则表达式中指定的模式前面。

脱字符会在每个由换行符决定的新数据行的行首检查模式。

示例解说:

只要模式出现在新行的行首,脱字符就能够发现它。

演示说明:

脱字符出现在正则表达式模式的尾部,sed编辑器会将它当作普通字符来匹配。

注意:

如果指定正则表达式模式时只用了脱字符,就不需要用反斜线来转义。但如果在模式中先指定了脱字符,随后还有其他一些文本,那么必须在脱字符前用转义字符。

3.3.2 锁定在行尾

跟在行首查找模式相反的就是在行尾查找。特殊字符美元符( $ )定义了行尾锚点。将这个特殊字符放在文本模式之后来指明数据行必须以该文本模式结尾。

3.3.3 组合锚点

在一些常见情况下,可以在同一行中将行首锚点和行尾锚点组合在一起使用。在第一种情况中,假定你要查找只含有特定文本模式的数据行。

示例说明:

匹配文本中以test开头和以test结尾的行

将两个锚点直接组合在一起,之间不加任何文本,这样过滤出数据流中的空白行。

示例说明:

定义的正则表达式模式会查找行首和行尾之间什么都没有的那些行。由于空白行在两个换行符之间没有文本,刚好匹配了正则表达式模式。sed 编辑器用删除命令 d 来删除匹配该正则表达式模式的行,因此删除了文本中的所有空白行。

3.4 点号字符

特殊字符点号用来匹配除换行符之外的任意单个字符。它必须匹配一个字符,如果在点号字符的位置没有字符,那么模式就不成立。

示例解说:

这个例子很具有说明性的,为什么第一行无法匹配,而第二行和第三行就可以。第四行有点复杂。注意, 我们匹配了at,但在at前面并没有任何字符来匹配点号字符。其实是有的!在正则表达式中, 空格也是字符,因此at前面的空格刚好匹配了该模式。第五行证明了这点,将at放在行首就不 会匹配该模式了。

3.5 字符组

使用方括号来定义一个字符组。方括号中包含所有你希望出现在该字符组中的字符。然后可以在模式中使用整个组,就跟使用其他通配符一样。

示例说明:

匹配这个模式的单词只有 cat 和 hat 。还要注意以 at 开头的行也没有匹配。字符组中必须有个字符来匹配相应的位置。

在不太确定某个字符的大小写时,字符组会非常有用。如下示例:

字符组不必只含有字母,也可以在其中使用数字。

示例说明:

这个正则表达式模式匹配了任意含有数字 0 、 1 、 2 或 3 的行。含有其他数字以及不含有数字的 行都会被忽略掉。

示例说明:

正则表达式模式可见于数据流中文本的任何位置。经常有匹配模式的字符之外的其他字符。如果要确保只匹配五位数,就必须将匹配的字符和其他字符分开,要么用空格,要么像这 个例子中这样,指明它们就在行首和行尾。

3.6 排除型字符组

在正则表达式模式中,也可以反转字符组的作用。可以寻找组中没有的字符,而不是去寻找组中含有的字符。要这么做的话,只要在字符组的开头加个脱字符。

示例说明:

使用排除型字符组,正则表达式模式会匹配 c 或 h 之外的任何字符以及文本模式。由于空格字 符属于这个范围,它通过了模式匹配。但即使是排除,字符组仍然必须匹配一个字符,所以以 at开头的行仍然未能匹配模式。

3.7 区间

示例说明:

新的模式 [c-h]at 匹配了首字母在字母 c 和字母 h 之间的单词。这种情况下,只含有单词 at 的行将无法匹配该模式。

示例说明:

该字符组允许区间a~c、h~m中的字母出现在at文本前,但不允许出现d~g的字母。

3.8 特殊的字符组

除了定义自己的字符组外, BRE 还包含了一些特殊的字符组,可用来匹配特定类型的字符。

  • [[:alpha:]] 匹配任意字母字符,不管是大写还是小写
  • [[:alnum:]] 匹配任意字母数字字符0~9、A~Z或a~z
  • [[:blank:]] 匹配空格或制表符
  • [[:digit:]] 匹配0~9之间的数字
  • [[:lower:]] 匹配小写字母字符a~z
  • [[:print:]] 匹配任意可打印字符
  • [[:punct:]] 匹配标点符号
  • [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
  • [[:upper:]] 匹配任意大写字母字符A~Z

示例说明:

使用特殊字符组可以很方便地定义区间。可以用 [[:digit:]] 来代替区间 [0-9] 。

3.9 星号【*】

在字符后面放置星号表明该字符必须在匹配模式的文本中出现 0 次或多次。

到此这篇关于十分钟上手正则表达式 上篇的文章就介绍到这了,更多相关正则表达式 入门内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-10-13

正则表达式常见的4种匹配模式小结

目录 0.写在前面 1.不区分大小写模式 2.点号通配模式 3.多行匹配模式 4.注释模式 5.写在最后 0.写在前面 今天一起来学习下正则中的匹配模式,所谓的匹配模式,就是指正则中的一些 改变元字符匹配行为 的方式,比如匹配时不区分英文字母的大小写. 还记得我们在第二篇文章中学过的贪婪模式.非贪婪模式和独占模式吗,这些模式会改变正则中量词的匹配行为,今天来看一些和量词无关的匹配模式,一共有4种,分别是不区分大小写模式.点号通配模式.多行匹配模式.注释模式. 1.不区分大小写模式 顾名思义,不区

正则表达式分组与引用的使用

目录 0.写在前面 1.分组与编号 2.不保存子组 3.分组引用 4.查找与替换 查找 替换 5.在文本编辑器中使用 查找 替换 6.写在最后 0.写在前面 今天我们来讲下正则中的分组与引用,其实在第一篇文章中,我们在实战环节就已经用到分组这个功能了,回顾下 IPv4 地址的正则表达式: 复制代码 代码如下: ^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5

正则表达式之分组的回溯引用问题

正则表达式简介 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本. 许多程序设计语言都支持利用正则表达式进行字符串操作.例如,在Perl中就内建了一个功能强大的正则表达式引擎.正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的.正则表达式通常缩写成"regex",单数有regexp.regex,复数有r

十分钟上手正则表达式 下篇

目录 一.正则表达式常用符号 1.1 问号[?] 1.2 加号[+] 1.3 花括号{} 1.4 管道符号[|] 1.5 小括号() 二.正则表达式实战示例 示例1: 示例2: 前面,我们就正则表达式一些常用的基本方法做了详细的介绍,本篇会讲解一些拓展性的知识,主要的就是常见的ERE模式符号以及shell脚本中常见的一些正则表达式例子. 快速学习正则表达式,不用死记硬背,示例让你通透(上篇) 一.正则表达式常用符号 本章示例着重于在gawk程序脚本中的较常见的ERE模式符号. 1.1 问号[?]

正则表达式量词与贪婪的使用详解

目录 0.写在前面 1.量词 2.贪婪模式前传 2.1 使用 a+ 进行匹配 2.2 使用 a* 进行匹配 3.贪婪模式 4.非贪婪模式 5.独占模式 5.1 贪婪匹配过程 5.2 非贪婪匹配过程 5.3 独占匹配过程 6.写在最后 0.写在前面 在上一篇文章中,我们学习了正则的一些基础元字符,相信大家都已经忘却的差不多了,可以点击上面的链接再温习下. 今天我们一起来学习下正则中量词的三种匹配模式,贪婪模式.非贪婪模式.独占模式,这些模式会改变正则中量词的匹配行为,是每次贪婪的匹配到更多呢,还是

正则表达式那些让人头晕的元字符

目录 0.写在前面 1.特殊单字符 2.空白符 3.范围 4.量词 5.实战 1.如何表达一个两位数字的范围 2.如何表达一个三位数字的范围 3.组合 6.写在最后 0.写在前面 在开发中,正则表达式常用于邮箱.手机号的校验,文本的批量查找.替换等操作. 大部分同学,在拿到需求的时候,第一件事一定是打开浏览器,搜索:邮箱 正则表达式 怎么写,然后Ctrl C + V,测试几个条件没问题,就提交了,出了问题也不知道怎么修改,只能再求救热心网友. 本篇文章,主要带大家了解一下,正则表达式的基本用法,

学习正则表达式30分钟入门教程(第二版)

由于本人内容过多排版比较乱,推荐大家浏览单独网页版 http://www.jb51.net/tools/zhengze.html 本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门--除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难.当然,如果你看完了这篇教程之后,发现

正则表达式30分钟入门教程 v2.1版

运行下面的代码就可以看到 正则表达式30分钟入门教程 h1 {text-align:center} p {text-indent:2em; line-height:140%; margin:auto 10px} span {margin:3px} table {margin:auto; border-style:solid; border-width:1px 1px 0 0; border-color:gray} td, th {border-style:solid; border-width:

ASP.NET 中的正则表达式

摘要:正则表达式是一种处理文本的有用工具.无论是验证用户输入.搜索字符串内的模式.还是以各种有效方式重新设置文本格式,正则表达式都非常有用.下载本文的源代码.引言Microsoft®.NET Framework 对正则表达式的支持是一流的,甚至在 Microsoft® ASP.NET 中也有依赖正则表达式语言的控件.本文介绍了深入学习正则表达式的基础知识和推荐内容. 本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET.可借助 .NET 编程的初学者.此外,希望本文连同 re

30分钟就入门的正则表达式基础教程

本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门--除非你是超人 :) 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难.当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的--我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以

正则表达式教程之匹配一组字符详解

本文实例讲述了正则表达式教程之匹配一组字符的方法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.匹配多个字符中的某一个 在上一篇<正则表达式教程之匹配单个字符详解>中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt.如果还有一个文件是cal.txt,那么也将会被匹配到.如

正则表达式单行、多行模式简介(使用说明)

继上几篇正则表达式相关说明(详情:正则表达式 ),我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方.单行,多行模式,都是正则表达式的模式修饰符里面出现的参数.目前常用正则表达式都有该使用选项,如:javascript 正则表达式,一般是:"/正则表达式匹配字符/修饰符" ,最后一个"/" 后面是修饰符.然后,php也是类似的,c#,python等,一般调用正则表达式的匹配函数,都有一个另外选项的,设置模式. 单行.多行模式容易出现理解错误 为什么说,容

详解Linux命令中的正则表达式

命令中的正则表达式 如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式.正则表达式是一套由多个元字符组成的模糊查找模式,使用正则表达式可以快速查找和定位文本中指定的内容. 1.单字符匹配符.  正则表达式主要由一些元字符和匹配模式组成 单字符匹配符可以匹配任意单个字符,这个字符的功能和文件名匹配符中的?功能相同 使用正则表达式查找文本,首先需要使用元字符组成一个查找模式 (1)使用查找模式时,通常将其放入两个斜杠//中,然后再放入命令,例如要在一个文本中查找匹配模式/.i...

PHP和正则表达式教程集合之二第1/2页

正则表达式快速入门(二) [导读]在本文里,我们主要介绍子模式(subpatterns),逆向引用(Back references)和量词(quantifiers) 在上篇文章里,我们介绍了正则表达式的模式修正符与元字符,细心的读者也许会发现,这部分介绍的非常简略,而且很少有实际的例子的讲解.这主要是因为网上现有的正则表达式资料都对这部分都有详细的介绍和众多的例子,如果觉得对前一部分缺乏了解可以参看这些资料.本文希望可以尽可能多涉及一些较高级的正则表达式特性. 在本文里,我们主要介绍子模式(su

正则表达式教程之位置匹配详解

本文实例讲述了正则表达式教程之位置匹配.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.问题引入 如果想匹配一段文本中的某个单词(暂不考虑多行模式,将在后面介绍),我们可能会像下面这样: 文本:Yesterday is history, tomorrow is a mystery, but today i

正则表达式 学习参考 推荐入门者看

1       概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中"高大"."坚固"等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派