- 论坛徽章:
- 0
|
1.关联回溯参照
可以用\g1或\g{1}或\g(1)代替原来的\1.
引用紧跟的组使用\g(-1),\g{-1},\g-1,引用再前面的组使用\g(-2),以此类推。
例:$a99a = '([a-z])(\d)\g(-1)\g(-2)'; #matches a11a,g22g,x33x,etc.
2.命名回溯参照
给捕获的组附加一个名字,可写为(?...)或(?'name'...).
回溯参照时用\k{name},\k'name'或\g{name},\g'name'.可以为多个组添加相同名字,但只有第一个能被引用。在规则表达式外命名捕获缓冲区是通过哈希变量%+来访问,例:$+{name}。
%-则存放命名捕获缓冲区的数组,例:$-{name}[0].
例:if ("foo bar baz"=~/(?
foo)\s*(?bar)\s*(?baz)/) {
print "Buffer '$_' is '$+{$_}'\n" for keys(%+);
}
输出为:
Buffer 'p' is 'foo'
Buffer 'r' is 'baz'
Buffer 'q' is 'bar'
3.调整捕获组的计数
例:if ($time =~ /(\d\d|\d) \d\d)|(\d\d)(\d\d)/) {
# process hour and minute
}
处理结果需要检查$1,$2,$3,$4中的值。使用(?|...)则可以简单的实现
if ($time =~ /(?|(\d\d|\d) \d\d)|(\d\d)(\d\d))/) {
print "hour=$1 minute=$2\n";
}
4.位置信息
匹配的位置信息存放在数组@-和@+中。$-[0]是整个匹配开始的位置,$+[0]是整个匹配的结束位置;$-[n]是$n匹配的开始位置,$+[n]是$n匹配的结束位置
$` <=> substr($x,0,$-[0])
$& <=> substr($x,$-[0],$+[0]-$-[0])
$' <=> substr($x,$+[0])
5.独占数量匹配
在表示数量的匹配后再加一个+,实现最多匹配但禁止回溯。即/(?>X)+/可以写为/X++/ |
|