Android studio 如何消除';新行上的大括号';使用Intellij搜索和替换模式?
我正在尝试使用以下搜索和替换模板查找所有的if语句,其中花括号写在新行中: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 ($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。我发现这个项目非常有帮助