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 中的正则表达式反向引用的主要内容,如果未能解决你的问题,请参考以下文章