在Geany中查找替换命名组regexp

在Geany中查找替换命名组regexp,regex,geany,Regex,Geany,我正在尝试将具有注释的方法的公共方法替换为受保护的方法 这是因为我使用phpunit来测试其中一些方法,但它们确实不需要公开,所以我希望在生产服务器上切换它们,并在测试时切换回 以下是方法声明: public function extractFile($fileName){ //TODO: change to protected 这是regexp: (?<ws>^\s+)(?<pb>public)(?<fn>[^/\n]+)(?<cm>//TOD

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

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

以下是方法声明:

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

(?<ws>^\s+)(?<pb>public)(?<fn>[^/\n]+)(?<cm>//TODO: change to protected)
它似乎起作用了,但我不能开始工作的是用命名替换。我必须使用\1来获取第一个组。如果在替换文本中无法访问组,为什么要命名这些组?我试过像,$ws,$ws这样的东西,但那不起作用

如果要用命名组替换\1,替换文本是什么?

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

${ws}受保护的${fn}\//TODO:更改回public进行测试

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

额外信息:

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

  • ?P
    是捕获语法
  • \g
    是替换字符串语法
  • (?P=ws)
    是regex反向引用语法
编辑:

看来我对解决问题的希望没有实现。从

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

再往下看:

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

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

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


这有多愚蠢?如果要在匹配模式中实现命名组及其用法,那么为什么不在替换字符串中也实现其用法呢?

谢谢,但这没有做到。在文档中的任何地方都找不到它。如果您可以命名组,您会认为可以在替换字符串中使用它。我通常会对任何有用的答案投赞成票,现在我看你也可以接受了。我现在就做。谢谢你的回答。也许我有一个不同的geany,但是如果我用表达式“(?win)7”替换为:“${w}8”,结果是:“${w}8”使用geany 1。22@HMR-我实际上没有基尼。我观察到捕获语法与.NET/Perl相同,这一点在我检查在线手册时得到了确认,因为两者都允许
?'ws'
。我希望底层的正则表达式引擎能够在替换字符串中使用名为captures的相同样式。只是多读了一些手册。替换字符串中似乎不允许使用命名组。我将编辑我的答案,以包含更多细节。感谢罗宾花时间研究这个问题。我在文档中没有找到任何关于替换字符串的内容,但我想确保在排除它之前没有忽略任何内容。@HMR我知道这是一个老问题,但我在Geany上使用了
(?PATTERN)
作为搜索字符串和
\1
作为替换字符串。也许你应该使用\ws…@Alex-你似乎没有抓住问题的关键。我们知道
(?模式)
->
\1
有效。所以
(?模式)
->
\1
(?模式)
->
\1
。但是
(?模式)
->
\2
不会。
(?模式)
->
\ws
。(既然您有Geany,您可能应该在发布建议之前尝试
(?模式)
->
\ws
))
(?模式)
,其中anything是字符串,表示名为anything(例如,“1”)的命名捕获组<代码>\n,其中n是一个数字,表示第n个捕获组
\ws
的字面意思是“\ws”。
\1protected\3\//TODO: change back to public for testing