WJMonitor舆情之声

企业大数据智能舆情监测管理解决方案

全网监测海量数据按需发布监测预警

实时把握舆情动态精准追溯信息源头

获取验证码
企业采购 个人使用
当前位置: 首页 > SEO博客 > 正则表达式简介

正则表达式简介

时间:2012-02-01 20:58:03
前言

做过程序开发的朋友们都会碰到这样一些问题,如何快速的判断一个字符串是一个URL地址,如何有效地验证客户的Email地址,如何快速地判断一个号码,以及如何在一段网页代码中找到具有相应特征的文本,等等,这些如果都是自己写程序算法的话,也是可以实现的,但可能写起来不一定很高效。有没有一个更好的办法来解决这类具有一定模式匹配的问题?答案是肯定的,那就是正则表达式(Regular Expression)。

正则表达式的产生背景

最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算的模型和对形式化语言描述与分类的研究。1940年代,Warren McCulloch与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。在1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。于是,正则表达式被广泛地使用于各种Unix或者类似Unix的工具,比如Perl。Perl的正则表达式源自于Henry Spencer写的Regex,后来演化成pcre(Perl兼容正则表达式),一个由Philip Hazel开发的,为很多现代工具所使用的库。各个程序开发语言之间的正则表达式的集成目前开展的很差,而未来的Perl6的子项目Apocalypse的设计中已考虑到了这点。

正则表达式的概念

正则表达式,英文即Regular Expression,简称为regex或regexp,缩写为RE。正则表达式,是在计算机科学中,指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed、awk及grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes等。

正则表达式

正则表达式的使用说明

一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。例如:Hadoop、Habdoop 和 Haedoop 这三个字符串,都可以由“H(a|ab|ae)doop”这个模式来描述。大部分正则表达式的形式都有如下的结构:

1,选择

| 竖直分隔符代表选择。例如“gray|grey”可以匹配grey或gray。

2,数量限定

某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”、“?”和“*”(不加数量限定则代表出现一次且仅出现一次):

1) + 加号代表前面的字符必须至少出现一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等;

2) ? 问号代表前面的字符最多只可以出现一次。(0次、或1次)。例如,“colou?r”可以匹配color或者colour;

3)* 星号代表前面的字符可以不出现,也可以出现一次或者多次。(0次、或1次、或多次)。例如,“0*42”可以匹配42、042、0042、00042等

3,匹配

圆括号可以用来定义操作符的范围和优先度。例如,“gr(a|e)y”等价于“gray|grey”,“(grand)?father”匹配father和grandfather。

上述这些构造子都可以自由组合,因此,“H(ae?)ndel”和“H(a|ae)ndel”是相同的。而更加精确的语法可能因不同的工具或程序而异。

正则表达式的用途

1,web表单验证。这个功能大家应该很熟悉,比如,在一个在线简历的提交表单中,用户需要输入email地址、邮政编码,以及个人网址等,为了保证这些字符串的有效性,就可以利用js的有效的正则表达式,先在客户端进行一次验证,保证输入的有效性,然后再提交到服务器端作后续的处理。

2,批量替换。批量替换特定规则的字符,也是比较常用的。例如,在某些博客或者论坛网站中,为了去除评论中的链接信息,就可以采用正则表达式来实现。

3,批量搜索和处理。例如,通过以下的一句linux命令,可以统计tcp的一些连接信息:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}',效果如下:

netstat awk命令

正则表达式工具

1,grep

grep是一个用来在一个或者多个文件或者输入流中使用RE进行查找的程序。它的name编程语言可以用来针对文件和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令,g/re/p,意思是global regular expression print。

2,sed

Sed是Stream EDitor的缩写,是Unix下常用的基于文件和管道的编辑工具,可以在手册中得到关于sed的详细信息。

3,awk

awk是一种编程语言,可以用来对文本数据进行复杂的分析和处理。可以在手册中得到关于awk的详细信息。这个古怪的名字是它作者们的姓的缩写(Aho,Weinberger和Kernighan)。

常用正则表达式举例

1,URL

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

2,电子邮件

^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$

3,IP地址

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

4,中国的

\d{17}[\d|X]|\d{15}

5,国内电话号码

\d{4}-\d{7}|\d{3}-\d{8}

关于正则表达式的,今天就讲这些,后续我会再写一些更为详细并且更加贴近实际的例子来,敬请期待。
分享按钮