在geany中查找替换命名组regex

时间:2012-11-28 08:36:32

标签: regex geany

我正在尝试将公共方法替换为具有注释的方法的受保护方法。

这是因为我使用phpunit来测试其中一些方法,但它们确实不需要公开,所以我想在生产服务器上切换它们并在测试时切换回来。

以下是方法声明:

public function extractFile($fileName){ //TODO: change to protected

这是正则表达式:

(?<ws>^\s+)(?<pb>public)(?<fn>[^/\n]+)(?<cm>//TODO: change to protected)

如果我将其替换为:

\1protected\3\//TODO: change back to public for testing

它似乎正在工作,但我无法工作的是命名替换。我必须使用\ 1来获得第一组。如果在替换文本中无法访问组,为什么要命名组?试过像\,$ ws,\ $ ws这样的东西,但这不起作用。

我的问题是:如果我想用命名组替换\ 1,那么替换文本是什么?

1 个答案:

答案 0 :(得分:9)

?<ws>命名组语法与.NET / Perl使用的语法相同。对于那些正则表达式引擎,命名组的替换字符串引用为${ws}。这意味着您的替换字符串将是:

${ws}protected${fn}\//TODO: change back to public for testing

m.buettner提到的\k<ws>引用仅用于实际正则表达式中的反向引用。

额外信息:

似乎geany也允许使用Python样式的命名组:

  • ?P<ws>是捕获语法
  • \g<ws>是替换字符串语法
  • (?P=ws)是正则表达式反向引用语法

修改

看起来我希望解决方案没有成功。来自manual

“子模式可以用以下三种方式之一命名:(?...)或(?'name'...),如在Perl中,或(?P ...),如在Python中。参考捕获来自模式的其他部分的括号,例如反向引用,递归和条件,可以通过 name 以及数字来创建。“

进一步向下:

“对名为子模式的后引用使用Perl语法\ k或\ k'name'或Python语法(?P = name)。”

名称引用的“子模式可能会在引用之前或之后出现在模式中。”

因此,我推断使用命名组的语法是正确的。不幸的是,它们只能用于匹配模式。这回答了你的问题“为什么要命名小组......?”。

这有多愚蠢?如果您在匹配模式中实现命名组及其用法时遇到了麻烦,为什么不在替换字符串中实现用法?