正则表达式概述
对于某些APP应用程序,您可能需要根据某些规则匹配并验证字符串,例如要求用户提供的QQ号为数字且至少5位。 用于描述这些规则的工具是正则表达式。
最简单的匹配
最简单的匹配是直接给出字符匹配。 在字符a中匹配aabab时,字符串的第1、2和4个结果匹配。 这种匹配是最简单的情况,但在实际处理中往往要复杂得多。 例如,相应的正则表达式为^d{5,}$,例如以下“QQ编号为数字且至少5位”
该正则表达式记述应该确定的内容是至少5位以上的数字。 让我们具体看看这个公式是如何描述这个规则的。 ^ :表示匹配字符串的开始。 也就是说,它不是包含在字符串中,而是独立的开始
d :表示一致数字
{5,} :表示至少匹配5位以上
$ :表示匹配字符串的结束。 也就是说,字符串是独立的结尾
显而易见,该正则表达式综合匹配5位以上的连续数字,有独立的开始和结束,无效,如小于5位的数字,或不以数字开始和结束的a123456b。
从这个例子可以看到,正则表达式是从左到右编写的。
同样,与移动编号匹配的正则表达式为^1d{10}$
提示
由于与正则表达式的匹配结果在很多情况下不是很确定,因此建议您下载用于测试正则表达式匹配结果的辅助功能。 这些工具可以是诸如匹配跟踪器、RegExBuilder等其他类似的工具。
元字符
在上例中,^、d、$等符号表示特定匹配的含义。 这叫做元字符。 常用的元字符如下: 元字符说明
.与换行代码以外的任意字符一致
与w字符、数字或下划线匹配
s与任意空白字符一致
D火柴的数字
b匹配单词的开始或结束
^开始匹配字符串
$匹配字符串的结尾
[x]匹配字符串中的x个字符,如a、b和c个字符
Ww的反义字,即与非字母字符、数字、下划线和汉字一致的字符
与Ss的反义字,即空白字符以外的字符一致
Dd的反义字,即与数字以外的字符一致
Bb的反义,即不是单词开头或结尾的位置
[^x]与除x以外的任何字符匹配。 例如,[^abc]与除abc以外的任何字符匹配
匹配这些元字符时,必须使用字符转义功能。 同样用于在正则表达式中表示转义。 如果要匹配.符号,必须使用. 否则,将被解释为“除换行符之外的任何字符”。 当然,要匹配,必须写
连续的数字或字符可以用-符号连接。 例如,匹配所有小写字母,[1-5]匹配5个数字: 1到5
我重复一遍
正则表达式的威力在于,模式可以包含选择和循环。 正则表达式用一些重复规则表示循环匹配。
常用的重复如下。 重复说明
*重复0次以上
重复一次以上
? 重复零次或一次
重复{n}次
{n,}重复n次以上
{n,m }重复n次至m次
分枝
分枝就是制定几条规则,如果满足某一条规则,就匹配成功。 具体来说,用|符号划分各种规则,并且使条件从左向右一致。
提示
由于分支规定,如果匹配成功,就不再匹配后面的条件,所以如果想匹配有包含关系的内容,请注意规则的顺序。
下面是使用分支的例子。
美国邮政编码的规则是将五个数字或五个数字与四个数字相连,例如12345或54321-1234。 如果匹配所有邮政编码,则正确的正则表达式如下: d{5}-d{4}|d{5}
//错误的写法
d {2}|d {3}-d {4}
以下错误书写方式只与5位数字和9位数字的前5位数字匹配,与9位数字的邮政编码不匹配。
分组
在正则表达式中,可以将一些规则放在括号中进行分组,分组可以视为元字符。
分组示例,验证IP地址: (d { 1,3 }.) d { 1,3 }
这是一个与IP地址匹配的简单、不完整的正则表达式,因为它不仅匹配正确的IP地址,还匹配不存在的IP地址,如322.197.578.888。
当然,在该表达式中成功匹配后,可以使用PHP算术比较来确定IP地址是否正确。 正则表达式没有算术比较功能。 要完全匹配正确的IP地址,必须进行以下改进: ((25(0-5)|2 )0-4) d|[01]? dd? () ) 25[0-5]|2[0-4]d|[01]? dd? )
规则的说明
该规则的关键是确保IP地址的每个范围为0-255,然后重复4次。 25[0-5]|2[0-4]d|[01]? dd?
>中,用分枝首先确定了 250-255 和 200-249 。 [01]?dd? 则确定了 0-199 的范围,综合起来就是 0-255 。贪婪与懒惰
正则表达式默认的情况下,会在满足匹配条件下尽可能的匹配更多内容。如 a.*b,用他来匹配 aabab ,它会匹配整个 aabab ,而不会只匹配到 aab 为止,这就是贪婪匹配。
与贪婪匹配对应的是,在满足匹配条件的情况下尽可能的匹配更少的内容,这就是懒惰匹配。
上述例子对应的懒惰匹配规则为:a.*?b
如果用该表达式去匹配 aabab ,那么就会得到 aab 和 ab 这样两个匹配结果。
常用的懒惰限定符如下:懒惰限定符说明
*?重复任意次,但尽可能少重复
+?重复 1 次或更多次,但尽可能少重复
??重复 0 次或 1 次,但尽可能少重复
{n,}重复 n 次以上,但尽可能少重复
{n,m}重复 n 到 m 次,但尽可能少重复
模式修正符
模式修正符是标记在整个正则表达式之外的,可以看着是对正则表达式的一些补充说明。
常用的模式修正符如下:模式修正符说明
i模式中的字符将同时匹配大小写字母
m字符串视为多行
s将字符串视为单行,换行符作为普通字符
x将模式中的空白忽略
epreg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
A强制仅从目标字符串的开头开始匹配
D模式中的 $ 元字符仅匹配目标字符串的结尾
U匹配最近的字符串
u模式字符串被当成 UTF-8