12

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

这是因为我正在使用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、$ws 之类的东西,但这不起作用。

如果我想用 <ws> 命名组替换 \1,替换文本是什么?

4

1 回答 1

11

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

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

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

额外的信息:

似乎 Geany 还允许使用 Python 风格的命名组:

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

编辑:

看来我对解决方案的希望没有成功。从手册中,

子模式可以用以下三种方式之一命名:Perl 中的 (?...) 或 (?'name'...) 或 Python 中的 (?P...)。从模式的其他部分捕获括号的引用,例如反向引用、递归和条件,可以按名称和编号进行。

再往下:

对命名子模式的反向引用使用 Perl 语法 \k 或 \k'name' 或 Python 语法 (?P=name)。

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

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

这是多么愚蠢?如果您不遗余力地实现命名组及其在匹配模式中的用法,为什么不在替换字符串中实现用法呢?

于 2013-01-21T20:09:47.030 回答