轻松理解正则表达式

本文是帮助刚接触正则表达式或用过还没有弄懂的童鞋理解正则表达式,主要描述了正则表达式是个什么小编,而不是讨论用法和工作原理。不过也欢迎高手批评指正,以更好的帮助新手。

无论是Java、Shell、Python、Perl都用正则表达式,说明它肯定是个好东西,那它到底是一个什么样小编呢?

正则表达式曾是我学Shell时最头大的一个问题,当时总以为他是条命令啥的,显然他不是,也显然是个表达式,那什么叫表达式呢,这个概念先不管,应该都听说过算术表达式吧,那算术表达式是啥呢,怎么描述呢,在数学课程中是这样描述的:由数字和运算符号组成的式子,可以简单清晰地记录或描述计算过程和内容【本句摘自百度百科】,我们只看前半句,说明是个式子,式子都知道吧,简单的说是一句话,有特定含义的一句话,当然编程语言中的算术表达式还是个式子,正则表达式也是个式子。

现在知道它也是一种表达式了,那他是干嘛用的呢?算术表达式是用于描述计算过程和内容的,正则表达式是描述了一批而不是一个字符串,为什么要描述一批字符串呢,比如你要显示当成目录下所有的以.c为后辍的文件,怎么办呢,都知道linux下显示文件是用ls命令,如果linux懂人的自然语言,那那样就可以这样:

$ ls 所有以.c为后辍的文件

可惜它不懂,所以会报错,你可能认为他不懂中文,你也可以用英文试试。

那我们怎么把这个的意思传达给它呢,肯定是要商定一个共同语言,正则表达式就是人与程序的一种共同语言,含通配符的表达式也是一种,不过通配符简单点,所以我们先用通配符试试:

elwin@Ubuntu64:~/work$ ls
1.c  1.java  2.c  2.java  3.c  file1.txt
elwin@Ubuntu64:~/work$ ls *.c
1.c  2.c  3.c
其中星号“*”表示任意字符串,于是用这个简单的*.c就是描述了所用以.c结尾的字符串,这是一批字符串,而不是一个,如果另一个字符串属于这一批字符串,就可以说该字符串与该表达式匹配成功,于是上例中所以匹配成功的都显示出来了。(说明一点,上述的通配符表达式不是被ls扩展,而是被shell扩展的,文章最后的附录有个脚本验证,有兴趣可以试试,但不知道这点并不会阻碍你对本文的理解)

虽然那不是正则表达式,但思想是一样的,本质是表达式中的某些的字符有特殊含义,当然这个特殊含义是相对就言的,例如上面的星号“*”对你而言就是星号,但对Shell而言,星号代表任意字符串,而在正则表达式中又不同,因为正则表达式与通配符就语法和符号代表的特殊含义是不同的,正规表达式的表达能力要强大得多,你可以认为正则表达式是通配升级版,其实正则表达式是一种计算机的一个重要理论,它被应用于编译器的词法分析,跟有穷自动机有重要的联系,关于历史,先不讨论了。与上面的等价的用正则表达式是这样的:

.*\.c
暂时看不懂没关系,下面慢慢解释,我们先用sed试一下吧:
elwin@Ubuntu64:~/work$ ls |sed -n '/.*\.c$/p'
1.c
2.c
3.c
用斜杠里面包括的(不含斜杠)就是一个正则表达式,(这条组合命令你不知道没关系,你只需要知道他的作用是:显示当前目录下,文件名符合该正则表达式的所有文件)。下面解释一下这个正则表达式,其中的点“.”代表任意字符,星号“*”表示将前面的那个字符重复n次(包括0次),这两个的意思就是将任意字符重复篇,如果正则表达式就这两个,后面不写了,那就表示世上所有字符串,我们再试一下吧:
elwin@Ubuntu64:~/work$ ls |sed -n '/.*/p'    
1.c
1.java
2.c
2.java
3.c
file1.txt

看吧,所有文件都列出来了,说明都匹配成功了。现在我们继续分析刚刚的表达式,星号后面的反斜杠表示转义,即把接下来的那个字符(这里是点号)当作普通字符,没有特珠含义,如果不在前面加上反斜杠就代表任何字符了,接下来的“c”在正则表达式里属于普通字符串,再接下来的美元符“$”表示换行符,于是整个表达式的意思就是:任意长度的字符串,连上“.c”,再接一个换行符,如果不接这个换行符,那“1.cc”也会被匹配,如:

elwin@Ubuntu64:~/work$ touch 1.cc
elwin@Ubuntu64:~/work$ ls |sed -n '/.*\.c/p'
1.c
1.cc
2.c
3.c

你可能有个疑问,哪到到底算特珠符号,哪些算普通符号呢,这当然有个规定了,这此特殊符号都有各自的含义,这种文章网上很多,大家可以搜索,也可以看man手册(man grep就可以),也可以参考此文,本文主要目是帮助初学者理解正则表达式,而不是讨论详细用法

还有一点需要说明,Shell、Java、Perl都有正规表达式,不过他们之间只有细微的区别,很多都是通用,其中以Perl中的正则表达式最强大,原因是Perl解释器强大。


附录

1.验证shell会扩展星号的脚本,将以下内容保存到test.sh:

#!/bin/sh
echo "$*"
这里的“$*”代表所以输入参数。加上执行权限运行./test.sh *.c,结果如下:
elwin@Ubuntu64:~/work$ ls 
1.c  1.cc  1.java  2.c  2.java  3.c  file1.txt  test.sh
elwin@Ubuntu64:~/work$ ./test.sh *.c
1.c 2.c 3.c

说明:本文章纯属个人观点,不保证绝对正确,欢迎大家批评和指正,同时我自己也会对本文不断的更新和完善。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


正则替换html代码中img标签的src值在开发富文本信息在移动端展示的项目中,难免会遇到后台返回的标签文本信息中img标签src属性按照相对或者绝对路径返回的形式,类似:<img src="qinhancity/v1.0.0/ima
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。当读到第一行时,匹配条件,然后执行指定动作,在接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件,则是默认匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。逐行读取文本,默认以空格或tab键为分割符进行分割,将分割所得的各个字段,保存到内建变量中,并按模式或或条件执行编辑命令。与sed工作原理相比:s
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。我们刚才在学习正则表达式的时候,我们表示数字,字母下划线的时候是用w表示的,为什么我们在书写的时候用的是w?我们可以发现我们分割空格的话,并没有达到我们预期的效果,这里我们可以使用正则表达式的方式进行分割。我们可以发现,我们和上面得到的结果不一致,既然出错了,肯定是我们的使用方式不对。看到这里我们就能感受到正则表达式的作用了,正则表达式是字符串处理的有力工具。
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发布,同步更新到和。欢迎大家投稿,,推荐或者自荐开源项目/资源/工具/文章~
本文涉及Shell函数,Shell中的echo、printf、test命令等。
常用正则表达,包括: 密码、 手机号、 身份证、 邮箱、 中文、 车牌号、 微信号、 日期 YYYY-MM-DD hh:mm:ss、 日期 YYY-MM-DD、 十六进制颜色、 邮政编号、 用户名、 QQ号
一、python【re】的用法1、re.match函数·单一匹配-推荐指数【★★】2、re.search函数·单一匹配-推荐指数【★★★★★】3、re.findall函数·多项匹配-推荐指数【★★★★★】4、re.finditer函数·多项匹配-推荐指数【★★★★】5、re.sub函数·替换函数-推荐指数【★★★★】二、正则表达式示例·总有一款适合你1、正则表达式匹配HTML指定id/class的标签2、正则表达式匹配HTML中所有a标签中的各类属性值3、获取标签的文本值
1.借助词法分析工具Flex或Lex完成(参考网络资源)2.输入:高级语言源代码(如helloworld.c)3.输出:以二元组表示的单词符号序列。通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。由于各种不同的高级程序语言中单词总体结构大致相同,基本上都可用一组正则表达式描述,所以构造这样的自动生成系统:只要给出某高级语言各类单词词法结构的一组正则表达式以及识别各类单词时词法分析程序应采取的语义动作,该系统
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。例如:我们在写登录注册功能的时候使用的表单验证(对用户名、密码进行一些字符或长度进行限制) ===> (`匹配`) - 正则表达式还常用于过滤掉页面内容的一些敏感词汇。例如:我们平常在打游戏时候的口吐芬芳被换成了***:full_moon_with_face: ===> (`替换`) - 正则表达式从字符串中获取我们想要的特定部分。例如:我们在逛淘宝的时候在搜索框中搜索内容,会弹出很多与搜索相关的提示内容 ===> (`提取`) etc..
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配”^”字符本身,请使用"^"$ 匹配输入字符串的结尾位置。如果设置了RegExp对象的 Multiline属性,则"$”也匹配'n'或'r’,。要匹配”$"字符本身,请使用”$". 匹配除"rn"之外的任何单个字符 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义* 匹配前面的子表达式零次或多次。...
给出补充后描述 C 语言子集单词符号的正则文法,设计并实现其词法分析程序。
正则表达式(Regular Expression),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。
Python Re 正则表达式 数据匹配提取 基本使用
正则表达式:是用来描述字符串内容格式,使用它通常用于匹配一个字符串的内容是否符合格式要求
python的学习还是要多以练习为主,想要练习python的同学,推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!