IntelliJ 中的正则表达式反向引用

Posted

技术标签:

【中文标题】IntelliJ 中的正则表达式反向引用【英文标题】:RegEx backreferences in IntelliJ 【发布时间】:2010-11-28 03:39:33 【问题描述】:

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

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

我尝试了以下方法:

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

但 Intellij 似乎没有将 \\1\\2 识别为反向引用。我也尝试过单斜杠,但这也不起作用。

【问题讨论】:

【参考方案1】:

IntelliJ 使用$1 进行替换 反向引用。

来自 IntelliJ 的帮助:

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

【讨论】:

似乎不需要“\”:jetbrains.com/idea/help/…。此外,对我来说,只有当我明确地用“()”包围我的组时它才有效,否则我以后无法引用它。例如:搜索(foo) 替换:$1bar @Ghedeon:您可能应该将您的评论添加为答案或现有答案。您将表达式放在 () 中的建议对我有用。 +1 解决了我的相关问题的信息位:我正在用美元卷曲包装器替换围绕变量的引号加包装器,即在某些模板字符串中 '+ var +'$var 和无法弄清楚为什么 intellij 不会完成替换。原来$ 需要在替换中转义。【参考方案2】:

简而言之,您必须使用$1$n 来进行替换 反向引用。 \1 语法仅用于搜索中的反向引用。

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

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

来源:2016.1 regular expression syntax, Tips & Tricks

【讨论】:

【参考方案3】:

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

反向引用 \n 无论第 n 个捕获组匹配什么

但显然,正如之前的答案中提到的并且是我的经验,它确实是 \$n 用于反向引用,而不是 \n

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

【讨论】:

【参考方案4】:

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


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

【讨论】:

我发现了同样的事情here;然而,我最终成功地使用了 $1,没有反斜杠。

以上是关于IntelliJ 中的正则表达式反向引用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式反向引用乘法[重复]

在 sed 中使用反向引用正则表达式

正则——反向引用

PHP正则表达式 - 替换一个反向引用[重复]

正则表达式;反向引用字符集中不匹配的字符

如何在正则表达式中反向引用“内部”选择( () )?