学好正则表达式需要注意的几点

关于preg_match 和preg_match_all 函数结果的说明

php代码为:

<?php
$str = "sdh111-757-111fkjhgjkiu888-060-888ygndfhdsuifyiud";
$reg = '/(d)1{2}-(d)d2-1{3}/i';

//preg_match($reg,$str,$res);
preg_match_all($reg,$str,$res);
var_dump($res);
?>

preg_match结果为:

Array

(

    [0] => 111-575-111

    [1] => 1

    [2] => 5

)

如果使用的是preg_match函数,匹配的结果是,只匹配一个结果

$res[0] 就是匹配到的内容

$reg[1] 就是第一个子表达式的内容

$reg[n] 就是第n个子表达式的内容

preg_match_all结果为

1:子表达式

就是在正则表达式中()里面的表达式,这些括号中的表达式匹配到的元素,会被捕获到内存中,就是上面preg_match和preg_match匹配的数组中除第一个以外的数组部分。

2:捕获 (请注意,如果你的正则表达式中有子表达式,则,正则表达式使用单引号括起来)

3:反向引用

上面的例子中的这个正则表达式:

$reg = '/(d)1{2}-(d)d2-1{3}/i';

这个正则表达式中就用到了反向引用,其中  1   2   都是反向引用,代表的是第一个、第二个子表达式匹配到的内容。

 

特殊的说明:

在正则规范中,我们可能会 看到 (?: pattern) (?! patter) (?<!pattern) (?=pattern) (?<=pattern)

(?: pattern) 非捕获匹配

这些特殊的表达式是正则中的  环视 有兴趣可以网上搜索学习。

表达式           说明

(?<=pattern) 逆序肯定环视,表示所在位置左侧能够匹配Expression

(?<!pattern)  逆序否定环视,表示所在位置左侧不能匹配Expression

(?=pattern)   顺序肯定环视,表示所在位置右侧能够匹配Expression

(?!pattern)    顺序否定环视,表示所在位置右侧不能匹配Expression

参考说明文档:

(?:pattern)      匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?!pattern)      负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

原文地址:https://www.cnblogs.com/573734817pc/p/10105146.html