IntelliJ中的RegEx后向引用


129

我想使用IntelliJ的查找和替换功能来执行以下转换:

// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar

我尝试了以下方法:

查找文本:model.put\((.*),(.*)\) 替换为:model\[\\1\] = \\2

但是Intellij似乎无法识别\\1\\2作为反向引用。我也尝试过一个斜杠,但这也不起作用。

Answers:


196

IntelliJ $1用于替换反向引用。

在IntelliJ的帮助下:

有关正则表达式及其语法的更多信息,请参考java.util.regex的文档。反向引用应具有$ n而不是\ n格式。


15
似乎不需要“ \”:jetbrains.com/idea/help/…。另外,对我来说,仅当我用“()”显式包围组时,它才有效,否则以后将无法引用它。例如:搜寻(foo)替换:$1bar
Ghedeon

@Ghedeon:您可能应该将评论添加为答案或添加到现有答案中。您建议将表达式放入()是对我有用的。
mindreader

+1的信息解决我的问题有关的位:我与美元卷曲包装,即替换报价,加上包装器变量,'+ var +'${var}在一些模板字符串和无法弄清楚,为什么的IntelliJ不会完成更换。事实证明$需要在替换中进行转义。
worc

13

总之,你必须使用$1$n进行更换反向引用。\1语法仅适用于搜索中的反向引用。

在IntelliJ 2016中,应用程序内文档具有误导性。这是完整文档的更好报价:

如果需要在当前正则表达式之外的某个地方引用匹配的子字符串(例如,在另一个正则表达式中作为替换字符串),则可以使用美元符号($ num,其中num = 1..n)来检索它。

来源:2016.1正则表达式语法,技巧与窍门


2

Idea 9.0(可能还有其他版本)中正则表达式的产品内上下文帮助似乎不正确。它指出:

  回引用
  \ n
  无论第n个捕获组是否匹配

但是很显然,正如前面的答案中提到的那样,这是我的经验,对于反向引用,它的确是\ $ n而不是\ n

通过单击“替换文本”对话框中“正则表达式”单选选项旁边的“ [帮助]”链接,可以获取此上下文帮助。


0

IntelliJ IDEA /参考/正则表达式语法参考


匹配子表达式并记住匹配项。如果需要在同一正则表达式中使用匹配的子字符串,则可以使用后向引用(\ num,其中num = 1..n)进行检索。如果需要在当前正则表达式之外的某个地方引用匹配的子字符串(例如,在“替换”字段中的另一个正则表达式中),则可以使用美元符号($ num,其中num = 1..n)来检索它。如果需要在子表达式中包含括号字符,请使用“(”或“)”。


我在这里找到了同样的东西; 但是,我最终使用$ 1成功了,没有反斜杠。
Joe Tricarico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.