perl regex:如何在字符串替换中使用命名捕获?

时间:2011-05-29 17:54:48

标签: regex perl

我必须在许多文件中用另一个字符串替换字符串。该字符串是我们与所有内部jarnames一起使用的特殊前缀。

例如跟随expresslaunch的行

 <encrypt key="${encrypt.key}" file="${expresshome}/lib/expresstools.jar"/>

变为

 <encrypt key="${encrypt.key}" file="${expresshome}/lib/turbotools.jar"/>

以下替代工作。

$line =~ s/express(?<JARNAME>[a-zA-Z_]+?\.jar)/turbo\1/g;

我试图使用命名捕获(perl 5.1中的新增功能)。但是,以下代码不起作用。

$line =~ s/express(?<JARNAME>[a-zA-Z_]+?\.jar)/turbo$+{JARNAME}/g;

有什么收获?名称捕获是否仅适用于模式匹配?

1 个答案:

答案 0 :(得分:4)

如果在正则表达式中有命名捕获,则使用%+变量访问其值。该功能可以按预期工作。

您的代码运行正常。这是我提倡总是编写一个完整且可运行的示例程序来解决您的问题的原因之一。一旦你删除了你的大程序中发生的所有其他事情,你可能会发现你隔离的部分正如你期望的那样工作,而不是问题。