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

目录
  • 一、正则表达式的定义:
  • 二、正则表达式的类型
  • 三、定义 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 次或多次。

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

(0)

相关推荐

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

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

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

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

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

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

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

    目录 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

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

    目录 一.正则表达式常用符号 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.写在前面 在上一篇文章中,我们学习了正则的一些基础元字符,相信大家都已经忘却的差不多了,可以点击上面的链接再温习下. 今天我们一起来学习下正则中量词的三种匹配模式,贪婪模式.非贪婪模式.独占模式,这些模式会改变正则中量词的匹配行为,是每次贪婪的匹配到更多呢,还是

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

    目录 一.正则表达式的定义: 二.正则表达式的类型 三.定义 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 程序

  • Java十分钟入门多线程上篇

    什么是多线程? 在学习前,我们先对程序.进程.线程.并行.并发有个基础的概念了解: 程序: 为完成指定任务,用编程语言编写的一组指令的集合,即指一段静态的代码,静态对象. 进程: 是程序的一次执行过程,是一个动态的过程,进程自身有产生.使用和消亡的过程.(也称为生命周期,在后面会介绍) 线程: 进程可进一步细化为线程,是一个程序内部的一条执行路径,也就是进程内有线程 并行: 指两个或者多个事件在同一时刻发生,(同时发生) 并发: 指两个或者多个事件在同一个时段内发生,(并不是同时发生) 更好的理

  • 十分钟带你快速上手Vue3过渡动画

    目录 写在前面 Vue的transition组件 过渡demo class的命名规则 使用animation 过渡模式 appear属性 animate.css库的使用 使用动画序列 使用自定义过渡class 写在最后 写在前面 在实际开发中,为了增加用户体验,经常会使用到过渡动画,而过渡动画在CSS中是通过transition和animation实现的.而在Vue中,Vue本身中内置了一些组件和API可以帮助我们方便的实现过渡动画效果:接下来我们就学习一下. Vue的transition组件

  • Java十分钟精通集合的使用与原理上篇

    目录 什么是集合? 集合分为Collection和Map两种体系 一.Collection接口: 二.Map接口下分为HashMap和TreeMap: 集合总结: Collections工具类: 什么是集合? 比如我们去买超市买很多东西,我们不可能拿一样就去收银台,我们可能是先放到购物车内,然后再统一处理,所以购物车相当于一个容器,可以装很多东西,在Java中的集合也是相当于一个容器,可以装很多数据. 集合继承关系图: 但是这张图太复杂了,我们看一张简便的: 集合分为Collection和Map

  • Spring Security十分钟入门教程

    目录 写在前面 目标 开始 不引入Spring Security访问接口 引入Spring Security访问接口 退出登录 后记 写在前面 我们在学习技术的过程中,学习的渠道大概有以下几种:看书,视频,博客.我们会发现,一种技术开始流行的时候,各种形式的讲述也就出现了.那么,出书,录视频,写博客的人,在他们之前,是没有什么现成的东西让他们学习的,他们是怎么上手的呢?换句话说,怎么才能有效的快速的上手一门技术呢? 这篇文章,我们一起从零开始学习SpringSecurity,技术点不重要,重要的

  • Python编程django实现同一个ip十分钟内只能注册一次

    很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦 逻辑: 取ip,在数据库找ip是否存在,存在判断当前时间和ip上次访问时间之差,小于600不能注册,到登录界面,大于600可以注册,设计一个数据库来存储这个ip地址和访问时间, class Ip(models.Model): ip=models.CharField(max_length=20) time=models.DateTimeField() class Meta: verbose_na

  • django实现登录时候输入密码错误5次锁定用户十分钟

    在学习django的时候,想要实现登录失败后,进行用户锁定,切记录锁定时间,在网上找了很多资料,但是都感觉不是那么靠谱,于是乎,我开始了我的设计,其实我一开始想要借助redis呢,但是想要先开发一个简单的,后续在拆分后,然后在去进行拆分, 这样也是很接近我们在真实的开发中所遇到问题. 我的思路是: 输入账号密码>是否已经登录>提示已经登录 输入账号密码>错误次数少于6次>校验密码>登录成功,记录登录时间,错误次数清空,记录登录状态 输入账号密码>错误大于六次>提示

  • django实现同一个ip十分钟内只能注册一次的实例

    很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦 逻辑: 取ip,在数据库找ip是否存在,存在判断当前时间和ip上次访问时间之差,小于600不能注册,到登录界面,大于600可以注册, 设计一个数据库来存储这个ip地址和访问时间, class Ip(models.Model): ip=models.CharField(max_length=20) time=models.DateTimeField() class Meta: verbose_n

  • javascript 小时:分钟的正则表达式

    复制代码 代码如下: /** * 小时:分钟的正则表达式检查<br> * <br> * @param pInput 要检查的字符串 * @return boolean 返回检查结果 */ public static boolean isUrl (String pInput) { if(pInput == null){ return false; } String regEx = " ^([0-1]{1}\d|2[0-3]):([0-5]\d)$"; Patter

随机推荐