如何使用 Intellij 搜索和替换模式消除 'braces on new line'?

How to eliminate 'braces on new line' using Intellij search and replace pattern?

我正在尝试使用以下搜索和替换模板查找所有将大括号写在新行中的 if 语句:

搜索模板:

if ($Expr$)
{
    $ThenStatements$;
}
else
{
    $ElseStatements$;
}

替换模板:

if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}

如果模板引擎不区分两个模板,我将面临这个问题。它让我用正确的模板替换搜索模板,但它也将 'correct' 个模板检测为错误模板。

有没有办法使用某种正则表达式来解决这个问题?

编辑: 在 Android Studio 上工作。我正在尝试为我的公司代码样式约定生成一组 lint 规则,这些规则将显示为警告或错误

我认为代码格式化程序是完成这项工作的正确工具。

我假设这是 Java 我们正在谈论的。

调整格式化程序设置:

  • 转到设置 -> 编辑器 -> 代码样式 -> Java -> (选项卡)环绕和大括号
  • 将大括号位置/其他项设置为:行尾
  • 检查预览是否是您想要的设置
  • 点击确定

格式化(全部)代码:

  • select根包
  • 单击 Alt+L(菜单:代码 -> 重新格式化代码)
  • 出现重新格式化代码对话框,单击确定

所有代码都要按规则重新格式化。

结构搜索和替换专为搜索代码而设计,无论其格式如何。因此,您的用例实际上不受支持。然而,通过一些技巧,您可以从中得到您想要的东西。

从您的搜索模板开始并将以下 Groovy 脚本约束添加到 $Expr$ 变量:

import com.intellij.psi.*
import com.intellij.openapi.editor.Document

PsiDocumentManager dm = PsiDocumentManager.getInstance(__context__.project)
Document d = dm.getDocument(__context__.containingFile)
PsiIfStatement is = __context__.parent
if (is.thenBranch != null && is.thenBranch.text.startsWith("{")) {
  if (d.getLineNumber(is.thenBranch.textOffset) > d.getLineNumber(is.RParenth.textOffset))
    return true
}
if (is.elseBranch != null && is.elseBranch.text.startsWith("{")) {
  if (d.getLineNumber(is.elseBranch.textOffset) > d.getLineNumber(is.elseElement.textOffset))
    return true;
}
return false 

此脚本检查 then 分支 { 是否在大于 if 语句的 ) 的行上,或者 else 分支 { 是否在大于 if 语句的行上else 关键字,或 returns false 否则。