博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分组,捕获及后向引用
阅读量:4049 次
发布时间:2019-05-25

本文共 1119 字,大约阅读时间需要 3 分钟。

-- Start

我们在 一节中了解到了括号的两种用途:分组和捕获。

分组

事实上,正在表达式还一共提供了三种结构用于分组,如下:

元字符(Metacharacter)  匹配(Matches)
(...)  分组
(?:...)  分组
(?>…)  固化分组 

它们之间有什么区别呢? 我们先看一个例子吧。

#!/usr/bin/perlmy $testText = "#test#"; # 测试文本# 基准if($testText =~ m/#.*#/) {	print "#.*# 匹配了 #test#\n";}# 测试 (...)if($testText =~ m/(#.*#)/) {	print "(#.*#) 匹配了 $1\n";}# 测试 (?:...)if($testText =~ m/(?:#.*#)/) {	print "(?:#.*#) 匹配了 $1\n";}# 测试 (?>...)if($testText =~ m/(?>#.*#>)/) {	print "(?>#.*#>) 匹配了 $1\n";} else {	print "(?>#.*#>) 无法匹配 #test#\n";}
运行结果:

#.*# 匹配了 #test#(#.*#) 匹配了 #test#(?:#.*#) 匹配了(?>#.*#>) 无法匹配 #test#
从结果中我们可以看出,(?:...) 只能用于分组,而 (...) 除了分组还捕获了括号中的内容。那 (?>...) 是什么意思呢?(?>#.*#>) 为什么无法匹配 #test# 呢?要想理解什么是固化分组,我们必须深入正则表达式的匹配原理,我们在 一节中介绍了什么是 占有量词,如果你理解了什么是占有量词,那么肯定知道了为什么 (?>#.*#>) 无法匹配 #test#。

捕获和后向引用

我们知道了括号除了可以用于分组,还可以用于捕获。我们为什么要捕获括号中的内容呢? 主要原因是,在捕获之后,我们可以通过后向引用来得到之前捕获的内容,这在文本替换操作中非常重要,捕获及后项引用的形式如下:

元字符(Metacharacter)  匹配(Matches)
(...)  捕获
\n  引用第n个括号中匹配的内容
(?<name>...)  命名捕获

命名捕获的意思是给捕获的内容起个名字,稍后我们可以通过这个名字来引用其内容,而无需通过 \n 的形式来引用。Perl 和 Java 不支持命名捕获。

--更多参见:

-- 声 明:转载请注明出处
-- Last Updated on 2012-05-13
-- Written by ShangBo on 2012-05-13
-- End

你可能感兴趣的文章
藏太甲于桐宫-从电视剧康熙王朝中学到的历史知识
查看>>
开发过程中的沟通问题
查看>>
“众”字透出的哲学
查看>>
恋爱爱情婚姻家庭与炒股票
查看>>
答非所问的古今中外名人小笑话幽默
查看>>
周易、命理、风水、姓名与命运交流周易研究心得:姓名学
查看>>
解决asp.net中tabstrip不能点击的问题
查看>>
PB中使用blob进行文件读取的性能问题
查看>>
DataWindow.net中如何实现鼠标划过时变颜色
查看>>
Datawindow.net中设置字符串的显示,超过长度部分显示为。。。
查看>>
PowerBuilder中使用带返回的powerobjectparm
查看>>
从oracle表中随机取记录,产生随机数和随机字符串
查看>>
功夫熊猫,中国式的哲学和西方式的搞笑
查看>>
Oracle SYS口令深入解析
查看>>
XP中IIS“http500”错误的终极解决方法
查看>>
李开复眼中的兰迪教授:引领你的一生
查看>>
早起的虫儿被鸟吃?
查看>>
Love Your Life》—— 热爱生活
查看>>
一个高速交警的忠告
查看>>
新车装饰的中国特色
查看>>