Android studio 如何消除';新行上的大括号';使用Intellij搜索和替换模式?

Android studio 如何消除';新行上的大括号';使用Intellij搜索和替换模式?,android-studio,intellij-idea,code-inspection,inspection,structural-search,Android Studio,Intellij Idea,Code Inspection,Inspection,Structural Search,我正在尝试使用以下搜索和替换模板查找所有的if语句,其中花括号写在新行中: if ($Expr$) { $ThenStatements$; } else { $ElseStatements$; } if ($Expr$) { $ThenStatements$; } else { $ElseStatements$; } 搜索模板: if ($Expr$) { $ThenStatements$; } else { $ElseStatements$;

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

if ($Expr$)
{
    $ThenStatements$;
}
else
{
    $ElseStatements$;
}
if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}
搜索模板:

if ($Expr$)
{
    $ThenStatements$;
}
else
{
    $ElseStatements$;
}
if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}
替换模板:

if ($Expr$)
{
    $ThenStatements$;
}
else
{
    $ElseStatements$;
}
if ($Expr$) {
    $ThenStatements$;
}
else {
    $ElseStatements$;
}
如果模板引擎不能区分两个模板,我将面临的问题是。它让我用正确的模板替换搜索模板,但它也会将“正确的”模板检测为错误模板

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

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

我认为适合此工作的工具是代码格式化程序

我想我们谈论的是Java

调整格式化程序设置:

  • 转到设置->编辑器->代码样式->Java->(选项卡)换行和大括号
  • 将项目大括号放置/其他设置为:行尾
  • 如果需要设置,请检查预览
  • 单击“确定”
格式化(所有)代码:

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

所有的代码都应该按照规则重新格式化。

我认为适合这项工作的工具是代码格式化程序

我想我们谈论的是Java

调整格式化程序设置:

  • 转到设置->编辑器->代码样式->Java->(选项卡)换行和大括号
  • 将项目大括号放置/其他设置为:行尾
  • 如果需要设置,请检查预览
  • 单击“确定”
格式化(所有)代码:

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

所有代码都应根据规则重新格式化。

Structural Search&Replace设计用于搜索代码,无论其格式如何。因此,您的用例实际上不受支持。然而,只要稍加修改,你就可以从中得到你想要的东西

从搜索模板开始,向
$Expr$
变量添加以下Groovy脚本约束:

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分支
{
位于比
else
关键字大的行上,或者返回
false
否则。

结构化搜索和替换是为搜索代码而设计的,无论代码的格式如何。因此,您的用例并不真正受支持。但是,只要稍加修改,就可以从中获得您想要的内容

从搜索模板开始,向
$Expr$
变量添加以下Groovy脚本约束:

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分支
{
位于比
else
关键字大的行上,或者返回
false
否则。

格式化工具很棒。但我不确定这是否是我要寻找的。我正在尝试生成一组lint规则,这些规则将在IDEs栏中显示为警告/错误标记。您的问题似乎是格式化问题,而不是静态code分析问题(主要使用棉绒)。您不想更改代码以改进格式,但只想报告问题?我曾想过使用lint强制执行我们的代码约定。格式设置可以解决问题一次,但仍然允许提交“坏”代码。您应该签出-它可以满足您的需要,并且可以安装在IDE和CI服务器中。是的,谢谢Marko。事实上,我最终整合了Checkstyle。我发现这个项目非常有帮助。格式化工具很棒。但我不确定这是我想要的。我正在尝试生成一组lint规则,这些规则将在IDEs中显示为警告/错误标记。您的问题似乎是格式化问题,而不是静态代码分析问题(主要使用棉绒)。您不想更改代码以改进格式,但只想报告问题?我曾想过使用lint强制执行我们的代码约定。格式设置可以解决问题一次,但仍然允许提交“坏”代码。您应该签出-它可以满足您的需要,并且可以安装在IDE和CI服务器中。是的,谢谢Marko.事实上,我最终整合了Checkstyle。我发现这个项目非常有帮助