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

目录
  • 一、正则表达式常用符号
    • 1.1 问号【?】
    • 1.2 加号【+】
    • 1.3 花括号{}
    • 1.4 管道符号【|】
    • 1.5 小括号()
  • 二、正则表达式实战示例
    • 示例1:
    • 示例2:

前面,我们就正则表达式一些常用的基本方法做了详细的介绍,本篇会讲解一些拓展性的知识,主要的就是常见的ERE模式符号以及shell脚本中常见的一些正则表达式例子。

快速学习正则表达式,不用死记硬背,示例让你通透(上篇)

一、正则表达式常用符号

本章示例着重于在gawk程序脚本中的较常见的ERE模式符号。

1.1 问号【?】

问号类似于星号,不过有点细微的不同。问号表明前面的字符可以出现 0 次或 1 次,但只限于 此。它不会匹配多次出现的字符。 示例展示:

脚本解说:

如果字符 e 并未在文本中出现,或者它只在文本中出现了 1 次,那么模式会匹配。

和星号一样,可以将问号和字符组一起使用。

脚本解说:

如果字符组中的字符出现了 0 次或 1 次,模式匹配就成立。但如果两个字符都出现了,或者其中一个字符出现了2 次,模式匹配就不成立。

1.2 加号【+】

加号是类似于星号的另一个模式符号,但跟问号也有不同。加号表明前面的字符可以出现 1次或多次,但必须至少出现1 次。如果该字符没有出现,那么模式就不会匹配。

示例解说:

如果字符 e 没有出现,模式匹配就不成立。加号同样适用于字符组,与星号和问号的使用方式相同。

脚本解读:

如果字符组中定义的任一字符出现了,文本就会匹配指定的模式。

1.3 花括号{}

ERE 中的花括号允许为可重复的正则表达式指定一个上限。这通常称为 间隔 ( interval )。 可以用两种格式来指定区间。

  • m:正则表达式准确出现m次。
  • m, n:正则表达式至少出现m次,至多n次。

这个特性可以精确调整字符或字符集在模式中具体出现的次数。

重点说明:

默认情况下, gawk 程序不会识别正则表达式间隔。必须指定 gawk 程序的 --re- interval 命令行选项才能识别正则表达式间隔。

示例:

示例解读:

通过指定间隔为 1 ,限定了该字符在匹配模式的字符串中出现的次数。如果该字符出现多次, 模式匹配就不成立。

同样也可以指定上限和下限

示例解读:

字符 e 可以出现 1 次或 2 次,这样模式就能匹配;否则,模式无法匹配。

下面是字符组的示例:

示例解读:

如果字母 a 或 e 在文本模式中只出现了 1~2 次,则正则表达式模式匹配;否则,模式匹配失败。

1.4 管道符号【|】

管道符号允许在检查数据流时,用逻辑 OR 方式指定正则表达式引擎要用的两个或多个模式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本匹配失败。

使用格式:

expr1 |expr2|...

示例:

示例解读:

这个例子会在数据流中查找正则表达式 cat 或 dog 。正则表达式和管道符号之间不能有空格, 否则它们也会被认为是正则表达式模式的一部分。

管道符号两侧的正则表达式可以采用任何正则表达式模式(包括字符组)来定义文本。看下面示例:

示例解读:

这个例子会匹配数据流文本中的 cat 、 hat 或 dog 。

1.5 小括号()

正则表达式模式也可以用圆括号进行分组。当将正则表达式模式分组时,该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符。

示例:

示例解读:

结尾的 urday 分组以及问号,使得模式能够匹配完整的 Saturday 或缩写 Sat 。

将分组和管道符号一起使用来创建可能的模式匹配组是很常见的做法。如下示例:

示例解读:

模式 (c|b)a(b|t) 会匹配第一组中字母的任意组合以及第二组中字母的任意组合。

二、正则表达式实战示例

示例1:

下面会有一个脚本,功能是对PATH环境变量中定义的目录里的可执行文件进行计数。

脚本内容如下:

#!/bin/bash
# count number of files in your PATH 

mypath=$(echo $PATH | sed 's/:/ /g') #用空格来替换冒号,分割路径
count=0
for directory in $mypath
do
 check=$(ls $directory)
 for item in $check
 do
 count=$[ $count + 1 ]
 done
 echo "$directory - $count"
 count=0
done

执行结果:

示例2:

正则表达式解析邮件地址

邮件地址的基本格式为:username@hostname
username值可用字母数字字符以及以下特殊字符:(点号、单破折线、 加号、 下划线)
在有效的邮件用户名中,这些字符可能以任意组合形式出现。邮件地址的hostname部分由一个或多个域名和一个服务器名组成。服务器名和域名也必须遵照严格的命名规则,只允许字母数字字符以及以下特殊字符:(点号、下划线)
服务器名和域名都用点分隔,先指定服务器名,紧接着指定子域名,最后是后面不带点号的
顶级域名。
顶级域名的数量在过去十分有限,正则表达式模式编写者会尝试将它们都加到验证模式中。
然而遗憾的是,随着互联网的发展,可用的顶级域名也增多了。这种方法已经不再可行。
从左侧开始构建这个正则表达式模式。

过滤用户名中表达式模式。

^([a-zA-Z0-9_\-\.\+]+)@

这个分组指定了用户名中允许的字符,加号表明必须有至少一个字符。下一个字符很明显是@。

hostname模式使用同样的方法来匹配服务器名和子域名:

([a-zA-Z0-9_\-\.]+)

顶级域名用的正则表达式模式:

\.([a-zA-Z]{2,5})$

整体组合模式:

^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$

封装到脚本中:

cat isemail.sh

#!/bin/bash
# script to filter out bad phone numbers
awk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})/{print $0}'

注意:在awk程序中使用正则表达式间隔时,必须使用--re-interval命令行选项。

示例测试脚本:

示例解读:

符合规则的邮件名会打印在屏幕,不符合的会被过滤掉,不会有内容输出。

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

时间: 2021-10-11

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

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

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

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

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

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

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

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

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

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

JS中正则表达式只有3种匹配模式(没有单行模式)详解

JS正则表达式对象模式仅有如下三种:  g (全文查找出现的所有 pattern) i (忽略大小写) m (多行查找) 即没有单行匹配模式,Singleline(单行模式):更改.的含义,使它与每一个字符匹配(包括换行符\n). 如java中 String regex = "(?s)(?<=interface).{0,500}(shutdown)";---------"."表示在一行. 但可以采用[\d\D]或[\w\W]或[\s\S]或(.|\s)*?来解

C#中正则表达式的3种匹配模式

在C#中,我们一般使用Regex类来表示一个正则表达式.一般正则表达式引擎支持以下3种匹配模式:单行模式(Singleline).多行模式(Multiline)与忽略大小写(IgnoreCase). 1. 单行模式(Singleline) MSDN定义:更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配). 使用单行模式的典型场景是获取网页源码中的信息. 示例: 我们使用WebBrowser控件,从http://www.xxx.com/1.htm上获取了如下HTM

Android常见的几种内存泄漏小结

一.背景 最近在项目的版本迭代中,出现了一些内存问题的小插曲,然后自己花了一些时间优化了APP运行时内存大小的问题,特此做个总结,与大家分享. 二.简介 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了.内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一.由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时

正则表达式惰性匹配模式(?)

正则表达式惰性匹配模式: 在贪婪匹配模式一章节已经说过人性是贪婪的,希望获得更多的金钱.地位甚至美女,但是也有很多清心寡欲的人,只要满足基本的生活需求就可以了,在正则表达式中也有这样的匹配原则,下面就进行一下介绍. 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: var str="axxyyzbdkb"; console.log(str.match(/a.*b/)); 以上代码是贪婪模式,于是能够匹配整个字符串,下面将其修改成惰性匹配模

正则表达式全局匹配模式(g修饰符)

正则表达式g修饰符: g修饰符用语规定正则表达式执行全局匹配,也就是在找到第一个匹配之后仍然会继续查找. 语法结构: 构造函数方式: new RegExp("regexp","g") 对象直接量方式: /regexp/g 浏览器支持: IE浏览器支持此元字符. 火狐浏览器支持此元字符. 谷歌浏览器支持此元字符. 实例代码: 实例一: var str="this is an antzone good"; var reg=/an/; console.

JS中正则表达式全局匹配模式 /g用法详解

本文章来详细介绍js中正则表达式的全局匹配模式 /g用法,代码如下: var str = "123#abc"; var re = /abc/ig; console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false 在创建正则表达式对象时如果使用了"g&q

PHP常见的几种攻击方式实例小结

本文实例总结了PHP常见的几种攻击方式.分享给大家供大家参考,具体如下: 1.SQL Injection(sql注入) ①.暴字段长度 Order by num/* ②.匹配字段 and 1=1 union select 1,2,3,4,5--.n/* ③.暴露字段位置 and 1=2 union select 1,2,3,4,5-..n/* ④.利用内置函数暴数据库信息 version() database() user() 不用猜解可用字段暴数据库信息(有些网站不适用): and 1=2 u

正则表达式之 贪婪与非贪婪模式详解(概述)

1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: "{m,n}"."{m,}"."?"."*"和"+". 在一些使用NFA引擎的语言中,在匹配优先量词后加上"?",即变成属于非

正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)

前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数.有时候,我们可能需要匹配一组多个字符一起出现的次数.这个时候,我们需要分组了.就是用小括号来括起这些字符,指定子表达式(也叫做分组).然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作.这个时候,可以把括号中一组字符,看作一个整体了. 分组模式举例说明 如:查找字符串中,连续出现多个win字符串的字符.可以这样完 <?php $str = "this is win wi

ASP 正则表达式常用的几种方法(execute、test、replace)

RegExp就是建立正则的对像. 如: Set regEx = New RegExp regEx.Pattern 就是来设置正则的模式的, 如: regEx.Pattern ="/d+" regEx.IgnoreCase = True ' 设置是否区分大小写 regEx.Global = True ' 设置全程可用性. RegExp对像有3种方法,分别是execute.test.replace. test方法是对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否