2010-03-13 208 views
4

我一直试图在替换操作数的正则表达式:Perl正则表达式中的圆括号是做什么的?

$str =~ s/^0+(.)/$1/; 

转换0000到0,0001至1

$str =~ s/^0+./$1/; 

转换0000到空字符串,000100 00,0001100〜100。

什么区别是括号做什么?

+1

另一方面,替换可能更清晰地写成's/^ 0 +(?=。)//'使用前瞻断言而不是捕获。 – hobbs 2010-03-13 05:40:41

+0

您可以尝试通过_Learning Perl_获取基础知识。 :) – 2010-03-17 03:07:50

+0

@brian肯定感谢 – 2010-03-17 03:59:25

回答

2

这似乎对我有点不当 - 你需要()来确定你的匹配。

http://perldoc.perl.org/perlre.html

捕捉缓冲器

的包围结构(...) 创建捕获缓冲器。要引用 缓冲以后 ,相同的图案内的当前内容,等等使用\ 1 用于第一,\ 2表示第二,和 。在比赛之外使用“$” 而不是“\”。 (该\符号 作品在某些情况下,外 比赛。可以看看下面的 \ 1比$ 1的细节的警告。)回 参考本场比赛的另一部分被称为 反向引用。

所以基本上你可以使用

if ($str =~ /^0+(.)/) { print "matched $1"; } 

如果你有一个以上的分组比赛,他们将是$ 1,$ 2,$ 3 ...等如

if ($str =~ /(0*)(1*)/) { print "I've got $1 and $2"; }

0

在第一次表达的情况下,$ 1 具有匹配的模式。

在第二表现形式的情况下,存在 不会$ 1个变量,因为它 不具有任何

分组。

+0

+1现在了解 – 2010-03-13 05:45:55

2

如果你想获得的$ 1或 $ 2您需要组 正则表达式的模式值。如果没有 分组,如果你想获得的价值, 它会显示错误信息,如果您 使用下面的语句。

use strict; 
use warnings; 

在第二份声明,如果使用 $ 1变量不进行分组。那么 那个时候$ 1的值将为 为空。所以它会将匹配的 值替换为空。