- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP正则之正向预查与反向预查讲解与实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace 。
正向或反向预查都是非获取匹配,不进行存储供以后使用.
(?:pattern) 匹配结果 。
(?=pattern) 正向匹配 。
(?!pattern) 正向不匹配 。
(?<=pattern) 反向匹配.
(?<!pattern) 反向不匹配.
什么叫非获取匹配(非捕获匹配),请看例子 。
1
2
3
4
5
6
|
$str
=
'XXXXjava6java7XXXX'
;
$perg
=
"/java(6|7)/"
;
//匹配java6 获取 java
preg_match_all(
$perg
,
$str
,
$matchs
);
$str1
= preg_replace(
$perg
,
'\0'
,
$str
);
//"XXXXjava6java7XXXX"
$str2
= preg_replace(
$perg
,
'\1'
,
$str
);
//"XXXX67XXXX"
|
$matchs输出结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
array
(2) {
[0]=>
array
(2) {
[0]=>
string(5)
"java6"
[1]=>
string(5)
"java7"
}
[1]=>
array
(2) {
[0]=>
string(1)
"6"
[1]=>
string(1)
"7"
}
}
|
$str1输出结果:
1
|
string(18)
"XXXXjava6java7XXXX"
|
$str2输出结果:
1
|
string(10)
"XXXX67XXXX"
|
知道了preg_match_all的用法,对于上面的输出结果应该很清楚,[n]的后向引用。 [0]中保存的是匹配结果的全文,数组的个数=匹配到结果的个数,[1] 中保存的匹配结果中对应括号中匹配的结果(子组),.....[n]第n个括号中的匹配内容.
preg_replace 中的 \0,\1,也是对匹配结果的引用.
$str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX", 用全文中的匹配结果进行对应替换 。
$str2 = preg_replace($perg, '\1', $str); //"XXXX67XXXX",用括号中的子结果进行对应的替换 。
我们对比知道,\0 的替换内容,是匹配全文的中内容,对应元素的替换.
1
2
3
4
5
|
$str
=
'XXXXjava6java7XXXX'
;
$perg
=
"/java(?:6|7)/"
;
preg_match_all(
$perg
,
$str
,
$matchs
);
$str1
= preg_replace(
$perg
,
'\0'
,
$str
);
//"XXXXjava6java7XXXX"
|
$match 输出结果:
1
2
3
4
5
6
7
8
9
|
array
(1) {
[0]=>
array
(2) {
[0]=>
string(5)
"java6"
[1]=>
string(5)
"java7"
}
}
|
$str1输出结果:
1
|
string(18)
"XXXXjava6java7XXXX"
|
对比例1中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果.
1
2
3
4
5
6
7
|
$str
=
'XXXXjava6java7XXXX'
;
$perg
=
"/java(?=6|7)/"
;
preg_match_all(
$perg
,
$str
,
$matchs
);
$str1
= preg_replace(
$perg
,
'\0'
,
$str
);
//"XXXXjava6java7XXXX"
var_dump(
$matchs
,
$str1
);
die
;
|
输出结果:
1
2
3
4
5
6
7
8
9
10
|
array
(1) {
[0]=>
array
(2) {
[0]=>
string(4)
"java"
[1]=>
string(4)
"java"
}
}
string(18)
"XXXXjava6java7XXXX"
|
相比上面的我们匹配的结果中没有 6,7 。
1
2
3
4
5
6
7
|
$str
=
'XXXXjava6java7XXXX'
;
$perg
=
"/java(?!6)/"
;
//不匹配java6
preg_match_all(
$perg
,
$str
,
$matchs
);
$str1
= preg_replace(
$perg
,
''
,
$str
);
//"XXXXjava67XXXX"
var_dump(
$matchs
,
$str1
);
die
;
|
输出结果:
1
2
3
4
5
6
7
8
|
array
(1) {
[0]=>
array
(1) {
[0]=>
string(4)
"java"
}
}
string(14)
"XXXXjava67XXXX"
|
这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了 。
主要:不管是怎么替换,如果我们只要用的是 \0(完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化, 。
(?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java 。
(?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java 。
1
2
3
4
5
6
7
|
$str
=
'XXXXjava6java7XXXX'
;
$perg
=
"/(?<!6)java/"
;
//不匹配前端有6的java
preg_match_all(
$perg
,
$str
,
$matchs
);
$str1
= preg_replace(
$perg
,
''
,
$str
);
//"XXXX6java7XXXX"
var_dump(
$matchs
,
$str1
);
die
;
|
输出结果:
1
2
3
4
5
6
7
8
|
array
(1) {
[0]=>
array
(1) {
[0]=>
string(4)
"java"
}
}
string(14)
"XXXX6java7XXXX"
|
总结:
正向预查,反向预查,就是方向不同。 正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找; 反向则在右边: / (?<!J)a /,从字符串向反方向(左)查找.
更多关于PHP正则使用技巧请查看下面的相关链接 。
原文链接:https://www.cnblogs.com/echojson/p/10880750.html 。
最后此篇关于PHP正则之正向预查与反向预查讲解与实例的文章就讲到这里了,如果你想了解更多关于PHP正则之正向预查与反向预查讲解与实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在阅读哈德利的 Advanced R并尝试一些东西。我正在尝试创建一个 lazy闭包函数返回一个带有提供的函数 data.frame在其环境中以及使用 with并且能够在以后提供额外的函数参数。
我有两个 ViewController。初始 ViewController 是输入和存储 URL 的地方。此初始 ViewController 的 viewDidLoad 还应该在应用程序启动时开始加
你是怎么用的 对于应用程序中的 ListView 项也应该在设备 <11 上运行? 由于 activated_state 在 HC 之前不可用,我只能想到两个肮脏的解决方法: 在您的 Activit
我正在为 android (2.1 > 3.1) 编写一个应用程序,我想使用熟悉的做法,即在 Honeycomb 应用程序中使用应用程序图标来进入家庭 Activity ,但是,当我之前运行该 Act
如果搜索的键不存在,我如何覆盖方法 GET 或编写一个将在服务器端执行的新函数返回另一个键值? 示例: 如果关键字“word_1 word_2 word_3 word_4”不存在则搜索关键字“word
对于我的存储库,我使用的是 Git 和 Stash。在 Stash 端,我限制了(只读)对 master 的访问权限,因此任何用户都可以从 master 分支分支以获取功能/分支,但不能直接 merg
如何配置dgrid及其存储以定义渲染行时是否已经选择了行? 例如,如果我的行数据是这样的: { id: 1, name: 'Item Name', selected: true } 我当前
有没有一种方法可以将变量从一个 BeanShell 前/后处理器引用到另一个 BeanShell 处理器(它们在同一个线程组中)? 如果我在 HTTP 请求下的 BeanShell 预处理器中创建了一
问题 我已尝试添加预操作 shell 脚本,这些脚本会根据我正在构建的内容打开/关闭我的 .pch 文件中的某些定义。 但是,在运行构建时,没有任何反应。我不是一个流利的 shell 脚本编写者,所以
我有一个 HTML 字符串用作 jQuery 输入文档。 // the variable html contains the HTML code jQuery( html ).find( 'p' ).
在 Mercurial 中允许 merge 之前有没有办法进行一些检查? 通过将以下内容添加到 ~/.hg/hgrc,我找到了更新前 Hook ,并拥有一个在允许更新之前运行的脚本: [hooks]
总结: 预 Controller Hook 是否在缓存期间执行?是否有任何 Hook 点可以执行? (系统前?) 我应该强调一个事实,即 Hook 不会影响发送到浏览器的内容。这不是问题。 详细版:
我正在使用适用于 android 的 Skobbler Map API,到目前为止它一直非常好。按照官方的“操作方法”,我已经能够将 map 应用到我的应用程序中。比我可以让应用程序下载 map 并离
当我安装bcrypt时我的 hapi js 项目的模块尚未安装,它显示类似 node-pre-gyp install --fallback-to-build 我尝试通过运行来安装; npm i nod
我试图使用此代码的变体: apply plugin: 'java' apply plugin: 'idea' idea.workspace.iws.withXml { provider ->
假设我们有一个 PHP 项目,其依赖项 A 和 B 分别依赖于 PHP 库 X,但版本不同。 通常,人们会使用诸如 composer 之类的 PHP 依赖管理器,它可以通过在与 A 和 B 兼容的版本
这似乎违背了代码块的目的,但我希望能够在代码块中加粗。例如,如果我想将返回行加粗: int main(void) { **return 0;** } 最佳答案 您必须在 HTML 中执行此操作
我们是否应该使用 Huggingface(预)训练一个 BERT 无框模型的小写输入数据?我查看了 Thomas Wolf ( https://github.com/huggingface/trans
我有两个模式: 技能: var mongoose = require("mongoose"); var SkillSchema = new mongoose.Schema({ skill: {
我这里有问题。这适用于 Chrome,但我无法在 IE11 的 index.html 中使用任何动画。当它不想工作时,我会看到一个静态屏幕。同样在 IE 中,消息不会像它应该的那样消失。如果我将 di
我是一名优秀的程序员,十分优秀!