php正则表达式中贪婪与非贪婪介绍
一、贪婪与非贪婪
贪婪,这个词在日常生活里可能意味着对某物的过度追求,而在编程和正则表达的世界里,贪婪则指的是在处理字符串时尽可能多地匹配的模式。想象一下,你面对一个包含多个面包描述的字符串:
在PHP中,正则表达式的贪婪行为可以通过修饰符来改变。默认情况下,正则表达式是贪婪的,会尽可能多地匹配。例如,使用正则表达式`/<td>(.)<\/td>/`匹配字符串时,它会匹配整个字符串,因为默认是贪婪模式。但当我们添加修饰符使模式变为非贪婪时,如使用`/<td>(.?)<\/td>/`,它就会尽可能少地匹配,只获取第一个
二、预搜索
预搜索是一种特殊的正则表达式技巧,它允许我们在匹配时查找某个模式是否存在于字符串中,但并不真正捕获该模式。这就像是在阅读一本书时,先预览一下接下来的内容,但不真正停下来仔细阅读。预搜索有两种主要形式:正向预搜索和负向预搜索。
正向预搜索“(?=x)”允许我们查找后面是否跟着某个特定的模式,但并不真正捕获该模式。例如,在字符串'windows NT windows 2003 windows xp'中,使用正则表达式`/windows (?=xp)/`只会匹配到xp前面的windows,而不会匹配到NT或2003前面的windows。这是因为使用了正向预搜索来检查后面是否跟着xp。
负向预搜索“(?!x)”则是检查后面是否没有某个特定的模式。在同样的字符串中,使用正则表达式`/windows (?!xp)/`会匹配到所有不是后面跟着xp的windows。这种预搜索形式有助于排除某些特定模式。值得注意的是,预搜索并不存储匹配结果供后续使用,它只是用来检查某个条件是否满足。这与常规的匹配存储形成鲜明对比。通过这两种预搜索方式,我们可以更灵活地处理字符串和提取所需的信息。PHP中的正则表达式:从匹配到反向预搜索
在PHP中,正则表达式是一种强大的工具,用于处理字符串和文本数据。让我们通过一些示例来其功能和优势。
让我们从一个简单的例子开始。假设我们有一个包含多个操作系统名称的字符串,如 "windows NT windows 2003 windows xp"。我们可以使用正则表达式来匹配这些名称并获取特定的部分。使用`preg_match_all`函数,我们可以匹配所有“windows”后面跟着任意字符但不是“xp”的部分。输出结果为:
```php
Array
(
[0] => Array (全部模式匹配的数组
[0] => windows N
[1] => windows 2
)
[1] => Array (子模式所匹配的字符串组成的数组,通过存储取得
[0] => N
[1] => 2
)
)
```
接下来,让我们反向预搜索的功能。反向预搜索允许我们匹配特定位置的字符串,而不管其前后内容如何。例如,我们可以匹配一个字符串中的特定数字序列,同时忽略前后的数字。使用`preg_match`函数和反向预搜索,我们可以匹配除前4个和后4个数字之外的中间8个数字。示例代码如下:
```php
$str = '1234567890123456';
preg_match('/(?<=\d{4})\d+(=\d{4})/',$str,$res);
print_r($res);
```
输出结果将是:
```php
Array
(
[0] => 56789012
)
```
我们还可以使用反向预搜索来排除某些字符或字符串。例如,我们可以匹配一个以非“我”字符开始的数字序列。示例代码如下:
```php
$str = '我1234567890123456';
preg_match('/(?
print_r($res);
```
输出结果将是:
```php
Array
(
[0] => 234567890123456
)
```
值得注意的是,PHP使用两种正则表达式规则:POSIX和PCRE。从PHP 5.3开始,POSIX被删除,因此建议使用PCRE(Perl Compatible Regular Expression)库提供的正则表达式。相较于ereg,preg_match效率更高。
正则表达式是处理字符串和文本数据的强大工具。通过学习和实践,您可以利用这些功能来构建高效、灵活的PHP应用程序。
编程语言
- php正则表达式中贪婪与非贪婪介绍
- phpStorm+XDebug+chrome 配置详解
- 总结的一些PHP开发中的tips(必看篇)
- Vue2.0 事件的广播与接收(观察者模式)
- javascript 作用于作用域链的详解
- jQuery.Uploadify插件实现带进度条的批量上传功能
- Javascript页面跳转常见实现方式汇总
- jQuery插件StickUp实现网页导航置顶
- js淡入淡出的图片轮播效果代码分享
- jQuery实现类似淘宝网图片放大效果的方法
- 利用PHPStorm如何开发Laravel应用详解
- JavaScript实现动态添加,删除行的方法实例详解
- 详解MySQL双活同步复制四种解决方案
- 解密ThinkPHP3.1.2版本之独立分组功能应用
- 发布asp.net core时如何修改ASPNETCORE_ENVIRONMENT环境变
- Angular ui.bootstrap.pagination分页