PHP学习笔记之POSIX正则表达式

1 基础知识

正则表达式是一种描述一段文本模式的方法。到目前为止,我们前面所用到过的精确(文字)匹配也是一种正则表达式。例如,前面我们曾搜索过正则表达式的术语,像"shop"和"delivery"。

在PHP中,匹配正则表达式更有点像strstr()匹配,而不像相等比较,因为是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串"shop"匹配正则表达式"shop"。它也可以匹配正则表达式"h"、"ho",等。

除了精确匹配字符外,还可以用特殊字符来指定表达式的元意(meta-meaning)。例如,使用特殊字符,可以指定一个在字符串开始或末尾肯定存在的模式,该模式的某部分可能被重复,或模式中的字符属于特定的某一类型。此外,还可以按特殊字符的出现来匹配。接下来,我们将逐个讨论这些变化。

2 字符集和类

使用字符集可以马上给出比精确匹配功能还要强大的正则表达式。字符集可以用于匹配属于特定类型的任何字符;事实上它们是一种通配符。

首先,可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符。例如,正则表达式:



.at



可以与"cat"、"sat"和"mat"等进行匹配。通常,这种通配符匹配用于操作系统中的文件名匹配。

但是,使用正则表达式,可以更具体地指明希望匹配的字符类型,而且可以指明字符所属的一个集合。在前面的例子中,正则表达式匹配"cat"和"mat",但也可以匹配"#at"。如果要限定它是a到z之间的字符,就可以像下面这样指明:



[a-z]at

任何包含在方括号([])中的内容都是一个字符类——一个被匹配字符所属的字符集合。请注意,方括号中的表达式只匹配一个字符。

我们可以列出一个集合,例如:



[aeiou]



可以用来表示元音子母。

也可以描述一个范围,正如前面用连字符那样,也可以是一个范围集:



[a-zA-Z]



这个范围集代表任何的大小写字母。

此外,还可以用集合来指明字符不属于某个集。例如:



[^a-z]



可以用来匹配任何不在a和z之间的字符。当把脱字符号(^)包括在方括号里面时,表示否。当该符号用在方括号的外面,则表示另外一个意思,我们稍后将详细介绍。

3 重复

通常,读者会希望指明某个字符串或字符类将不止一次地出现。可以在正则表达式中使用两个特殊字符代替。符号“*”表示这个模式可以被重复0次或更多次,符号“+”则表示这个模式可以被重复1次或更多次。这两个符号应该放在要作用的表达式的后面。

例如:



[[:alnum:]]+



表示“至少有一个字母字符”。

4 子表达式

通常,将一个表达式分隔为几个子表达式是非常有用的,例如,可以表示“至少这些字符串中的一个需要精确匹配”。可以使用圆括号来实现,与在数学表达式中的方法一样。

例如:



(very)*large



可以匹配"large"、"very large"、"very very large"等。

5 子表达式计数

可以用在花括号({})中的数字表达式来指定内容允许重复的次数。可以指定一个确切的重复次数({3}表示重复3次),或者一个重复次数的范围({2,4}表示重复2~4次),或是一个开底域的重复范围({2,}表示至少要重复两次)。

例如:



(very){1,3}



表示匹配"very"、"very very"和"very very very"。

6 定位到字符串的开始或末尾

[a-z]模式将匹配任何包含了小写字母字符的字符串。无论该字符串只有一个字符,或者在整个更长的字符串中只包含一个匹配的字符,都没有关系。

也可以确定一个特定的子表达式是否出现在开始、末尾或在两个位置都出现。当要确定字符串中只有要找的单词而没有其他单词出现时,它将相当有用。

脱字符号(^)用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始处,字符“$”用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾。

例如,以下是在字符串开始处匹配bob:



^bob



这个模式将匹配com出现在字符串末尾处的字符串:



com$



最后,这个模式将匹配只包含a到z之间一个字符的字符串:



^[a-z]$



7 分支

可以使用正则表达式中的一条竖线来表示一个选择。例如,如果要匹配com、edu或net,就可以使用如下所示的表达式:



com|edu|net



8 匹配特殊字符

如果要匹配本节前面提到过的特殊字符,例如,.、{或者$,就必须在它们前面加一个反斜杠(\)。如果要匹配一个反斜杠,则必须用两个反斜杠(\\)来表示。

在PHP中,必须将正则表达式模式包括在一个单引号字符串中。使用双引号引用的正则表达式将带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符——例如反斜杠。

如果希望在模式中匹配一个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。

同样,由于相同的原因,如果希望在一个双引号引用的PHP字符串中使用反斜杠字符,必须使用两个反斜杠。这可能会有些混淆,这样要求的结果将是表示一个包含了反斜杠字符的正则表达式的一个PHP字符串需要4个反斜杠。PHP解释器将这4个反斜杠解释成2个。然后,由正则表达式解释器解析为一个。

$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配,必须使用“\\\$”。因为这个字符串被引用在双引号中,PHP解释器将其解析为\$,而正则表达式解释器将其解析成一个$字符。

9 在智能表单中应用

在智能表单应用程序中,正则表达式至少有两种用途。第一种用途是在顾客的反馈中查找特定的名词。使用正则表达式,可以做得更智能一些。使用一个字符串函数,如果希望匹配"shop"、"customer service"或"retail",就必须做3次不同的搜索。如果使用一个正则表达式,就可以同时匹配所有3个,如下所示:



shop|customer service|retail



第二个用途是验证程序中用户的电子邮件地址,这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。这个格式中包含一些数字或标点符号,接着是符号“@”,然后是包括文字或数字和字符组成的字符串,后面接着是一个“.”(点号),后面包括文字或数字以连字符组成的字符串,可能还有更多的点号,直到字符串结束,它的编码如下所示:



^[a-zA-Z0-9_\-.][email protected][a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$



子表达式^[a-zA-Z0-9_\-.]+表示“至少由一个字母、数字、下画线、连字符、点号或者这些字符组合为开始的字符串”。请注意,当在一个字符类的开始或末尾处使用点号时,点号将失去其特殊通配符的意义,只能成为一个点号字符。

符号“@”匹配字符“@”。

而子表达式[a-zA-Z0-9\-]+与包含文字数字字符和连字符的主机名匹配。请注意,我们去除了连字符,因为它是方括号内的特殊字符。

字符组合“\.”匹配“.”字符。我们在字符类外部使用点号,因此必须对其转义,使其能够匹配一个点号字符。

子表达式[a-zA-Z0-9\-\.]+$匹配域名的剩下部分,它包含字母、数字和连字符,如果需要还可包含更多的点号直到字符串的末尾。

不难发现,有时一个无效的电子邮件地址也会符合这个正则表达式。找到所有无效电子邮件几乎是不可能的,但是经过分析,情形将会有所改善。可以按许多不同的方式精化这个表达式。例如,可以列出所有有效的顶级域(TLD)。当对某些对象进行限制的时候,请千万小心,因为可能排斥1%的有效数据的校验函数比允许出现10%的无效数据的校验函数还要麻烦。

时间: 2024-10-13 17:50:28

PHP学习笔记之POSIX正则表达式的相关文章

《MySQL必知必会学习笔记》:正则表达式

正则表达式的应用 前面的几节的过滤例子允许用匹配.比较和通配操作符来寻找数据.对于基本的数据过滤,这样就足够了.但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加.这也就是正则表达式变得有用的地方. 正则表达式是用来匹配文本中特殊的字符集合. 正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串.可能具体的用法不太一样,但也差不多.下面将一一进行学习.介绍. 基本字符的匹配 当我们想查找某列中的字符中是否有

【知了堂学习笔记】java 正则表达式

本文参考网络上面别人的博客知识产出 正则表达式基础 1.句号 假设你想要找出三个字母的单词,而且这些单词必须以"t"字母开头,以"n"字母结束.另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容.要构造出这个正则表达式,你可以使用一个通配符--句点符号".".这样,完整的表达式就是"t.n",它匹配"tan"."ten"."tin"和"ton&qu

python学习笔记9:正则表达式

一.简介 正则表达式就是用来查找字符串的:用来匹配一些比较复杂的字符串. 使用正确表达式需要引入re模块        (regular定期的有规律的) 二.匹配字符串的方法 三.常用的正则表达式符号

perl学习笔记之:正则表达式

 Perl 中的正则表达式 正则表达式的三种形式  正则表达式中的常用模式  正则表达式的 8 大原则          正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用正则表达式来完成字符串处理的任务,当然在 CGI 程序设计中就更能得心应手了.下面我们列出一些正则表达式书写时的一些基本语法规则. ----------------------------------------------------------------

python学习笔记21(正则表达式)

正则表达式模式: 除了控制字符(+ ? . * ^ $ ( ) [ ] { } | \),所有字符匹配自己.可以通过用反斜杠前就转义控制字符. 下表列出了Python中可用正则表达式语法: 模式 描述 ^ 匹配的开始的 $ 匹配行尾 . 匹配除换行符的任何单个字符.使用-m选项允许其匹配换行符也是如此. [...] 匹配括号内任何单个字符 [^...] 匹配任何单个字符不在括号中 re* 匹配0个或多个匹配前面表达式. re+ 匹配1个或多个先前出现的表达式. re? 匹配0或1前面出现的表达式

Java学习笔记(5)----使用正则表达式解决Google Code Jam Qualification2009赛题 Alien Language

原题地址:https://code.google.com/codejam/contest/90101/dashboard#s=p0 题目描述: Problem After years of study, scientists at Google Labs have discovered an alien language transmitted from a faraway planet. The alien language is very unique in that every word

python学习笔记九:正则表达式

本文不涉及正则表达式本身的内容,只记一下python中正则的用法及常用方法. 一.re模块 python中用re模块进行正则处理 >>>import re >>>s = r'abc' >>>re.findall(s,'aaaabcaaaaa') ['abc'] 或先编译(会更快): >>> import re >>> r1 = re.compile(r'abc', re.I) >>> re.find

Linux运维学习笔记-通配符及正则表达式知识总结

通配符: * 代表所有   ? 任意一个字符   : 两个命令的分隔符   # 注释   | 管道,将|前命令的执行结果作为|后命令的输入   ~ 用户的家目录   - 上一次的目录   $ 变量前面需要加的符号 echo $LANG / 路径分隔符   > 重定向(覆盖)   >> 追加重定向   < 输入重定向 xargs.tr << 追加输入重定向 cat '' 单引号,不具有变量置换功能,输出时所见即所得 echo 'date' "" 具有变

C++ GUI Qt4学习笔记05

C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator           --  只让用户输入整数 QDoubleValidator     --  只让用户输入浮点数 QRegExpValidator    --  只让用户按照正则表达式定义好的样式进行输入 本章讲解如何使用Qt开发自定义窗口部件. 通过对一个已经存在的Qt窗口部件进行子类化或者直接对QWidget进行子类化,就可以创建自定义窗口部件. 集成自定义窗口到Qt设计师中,这样就可以像使用内置的Qt窗