诱人的正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。——维基百科

正则表达式是计算机智能的一种体现,她能让我们在繁杂的计算机文本之中找到我们最想要的东西,在她那规则而又朦胧的面纱之下是一张优雅而又调皮的面孔,对于初入Linux大门的男人来说,无不拜倒在她的石榴裙下,而本文所要做的就是如何俘获她的芳心。

一、了解她的身世

  在1956 年,美国的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。近二十年来,在WINDOW的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!目前主流的开发语言(PHP、C#、Java、C++、VB、Javascript、Ruby以及python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。

二、揭开她的面纱

好了,继上次inode之后我们又遇到了一个让人无从下手的东西,但是不管怎么说我们还得学她,所以先来看看正则表达式都有些什么吧:

基本正则表达式元字符:

字符匹配:

.  :匹配任意单个字符

[]: 匹配指定范围内的任意单个字符

[^]: 匹配指定范围外的任意单个字符

[0-9], [[:digit:]], [^0-9], [^[:digit:]]

[a-z], [[:lower:]]

[A-Z], [[:upper:]]

[[:space:]]

[[:punct:]]

[0-9a-zA-Z], [[:alnum:]]

[a-zA-Z], [[:alpha:]]

次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数

*  : 任意长度,表示0次、1次或多次;

.*: 任意长度的任意字符

工作于贪婪模式

\?:0次或1次;表示其左侧字符可有可无

\+: 1次或多次;表示其左侧字符至少出现1次;

\{m\}:m次;表示其左侧字符精确出现m次;

\{m,n\}:至少m次,至多n次;

\{0,n\}:至多n次;

\{m,\}:至少m次;

位置锚定:

^: 锚定行首

$: 锚定行尾

^$: 匹配空白行;

单词锚定:由非特殊字符组成的连续的字符串

\< :锚定词首,也可用\b

\> :锚定词尾,也可以用\b

\<PATTERN\>:匹配PATTERN能匹配到的整个单词

分组:\(\)

\1,\2...\n:用于表示引用前面分组的内容

扩展的正则表达式:

字符匹配:

.

[]

[^]

次数匹配:

*: 任意次

?:0或1次

+: 至少1次

{m}:精确匹配m次;

{m,n}:至少m次,至多次;

{m,}:至少m次;

{0,n}:至多次;

位置锚定:

^

$

\<, \b

\>, \b

分组:

()

引用:\1, \2, ...

或者:

a|b:a或者b

或者两侧的所有内容;

三、强吻她

额,我知道走到这一步可能有点出乎大家的意料,不过要知道强吻一个女孩儿是最快得到答复的一种方式,不是吗?OK,想要强吻我们就需要手、嘴并用,好了来看看我们能用的手和嘴都有哪些吧。我们在了解女神身世的时候知道我们的Unix之父引入了grep,在Unix的grep家族中包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的元字符,fgrep就是把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。

好了,我们的手嘴已经就绪开始行动吧:

我们循序渐进先来个简单动作-->查找/proc/meminfo中以s|S开头的行

我们一只手的用法grep [OPTIONS] PATTERN [FILE...],其中^为锚定行首,[sS]表示只能选择这个集合之中s和S两个字母。

我们再来一个-->找出/etc/passwd文件中的一位或者两位数,为了让我们的动作不那么苍白,我们给她点颜色看看

--color选项表示以彩色形式显示搜索出来的内容,\<\>这两个组合起来可以确定一个单词,[0-9]表示一个数字范围在0-9之中选,而\?表示其前面的字符可出现一次或者不出现。

我们的动作越来越熟练了-->我们给出几个句子,看看如何使用分组

我们输出了四个句子,其中有两个前后很像,我们用分组和引用把它们找出来了:\(l..e\).*\1,l..e表示以l开头中间根两个任意字母,然后把这个看成一个整体,.*表示任意长度的字符,\1表示引用前面使用\(\)括起来的内容。

如果要一直使用带颜色输出我们可以通过定义别名的形式为以后少点麻烦:

[[email protected] ~]# alias grep=‘grep --color‘

接下来我们来点有难度的-->取出一个路径的路径名

grep -o表示只显示被选中内容,这里我们用到了两次grep,第一次[^/]表示最后匹配到不以/结尾的字符,/.*/就表示两个分割符之间的内容了,如果我们想要得到类似dirname命令那样的格式可以使用

[[email protected] ~]# echo ‘/etc/rc.d/init.d/‘ | grep -o ‘/.*[^/]‘ | grep -o ‘/.*/‘ | grep -o ‘/.*[^/]‘ 大家可以去试一下。

我们不能一直使用一只手,该清楚另一只了-->取出一个路径的基名

egrep等于grep -E,都代表是扩展的正则表达式,+表示其前面的[^/]出现一次或者多次,?我们前面解释过了,$表示锚定行尾,在结尾处带有/的路径名,我们可以使用cut切一下就可以了。

我们再来巩固一下成果:

第一个我们的目的是在字符串中找到前后名称一致而后缀不一致的内容;第二个我们的目的是在字符串中找到符合邮箱格式的内容,大家自己体会一下吧,我就不再解释了。

为了防止成为“三只手”,我就不再介绍fgrep了,它其实很简单,就是字符本来样子的匹配。

经过这三个强劲的“泡妞”步骤我想你应该可以俘获她的芳心了,但是如果想把这位狡猾的女神娶回家还需要各位更加深入的努力啊,知己知彼方能百战不殆嘛!

好了希望这篇文章能够给您带来帮助,敬请各位看官提出此文章的不当之处,拜谢!

PS:grep,egrep,fgrep的使用方法各位使用man命令看一下吧,本文不再赘述。

时间: 2024-11-04 15:59:24

诱人的正则表达式的相关文章

正则表达式学习(转)

http://www.codeceo.com/article/you-should-learn-regex.html Regular Expressions (Regex):正则表达式,软件工程中最为强大,且广泛适用,令人信服的技术之一.从验证电子邮件地址到执行复杂的代码重构器,正则表达式的用途非常广泛,是任何软件工程师工具箱中必不可少的条目. 什么是正则表达式? 正则表达式(或Regex,或Regexp)是使用字符序列描述复杂搜索模式的一种方式. 然而,专门的Regex语法由于其复杂性使得有些

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4

正则表达式中的逆向思维

人们的正常思维都是顺向的,那么逆向思维呢,特别是初学正则表达式的同学们,好不容易掌握了正则表达式的用法,再突然要你用逆向思维做题,会有很多不适应: 这里拿三道题,来做简单介绍: 1.经典例题取IP: [[email protected] ~]# ifconfig eth0|sed -nr '2s#^[^0-9]+(.*)[a-Z]{5,}.*#\1#gp' 10.0.0.200 2.调换/etc/passwd中最后一列和第一列的位置: [[email protected] ~]# head /p

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

前端学PHP之正则表达式函数

前面的话 正则表达式不能独立使用,它只是一种用来定义字符串的规则模式,必须在相应的正则表达式函数中应用,才能实现对字符串的匹配.查找.替换及分割等操作.前面介绍了正则表达式的基础语法,本文将详细介绍正则表达式函数 匹配与查找 [preg_match()] preg_match()函数用来执行一个正则表达式匹配,搜索subject与pattern给定的正则表达式的一个匹配.返回pattern的匹配次数.它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后将会停止搜索.preg

正则表达式

grep命令和正则表达式 一. 正则 : 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑.给定一个正则表达式和另一个字符串,我们可以达到如下的目的:1. 给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配"):2. 可以通过正则表达式,从字符串中获取我们想要的特定部分. 正则表达式和通配符一样,也是一组特殊符号,通配符是由sh

java中的正则表达式

正则表达式 : 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 一些字符所代表的意思: \        将下一字符标记为特殊字符.文本.反向引用或八进制转义符^       匹配输入字符串开始的位置$       匹配输入字符串结尾的位置.        匹配任何单个字符\s      空白(空格符.换行符.回车符.制表符)\S     非空白[]  

Python 正则表达式相关问题

这几天学习python,写正则表达式相关代码如下: import re print(re.search(r'(?<=<(\w+)>).*(?=<\/\1>)',"<b>ewuiiriur</b>sdksfkj").span()) 报错如下: raise error("look-behind requires fixed-width pattern")sre_constants.error: look-behind

7.python之正则表达式re模块

一.re模块的常用方法: re.findall() 用于返回一个字符串中,所有能被正则表达式所匹配到的字符串,以列表的方式返回. 用法re.findall(正则表达式,字符串). s1 = "sadjhjafdsajkhjsdaysadsadduayu" 比如说,想要从上面这一长串字符串中,匹配出a后面有一个任一字符在紧接着一个字母u的字符串. print re.findall('a.u',s1) >>>['ayu'] re.finditer()作用和findall一