我正在尝试使用以下搜索和替换模板查找所有if语句,其中花括号写在新行中:
搜索模板:
if ($Expr$)
{
$ThenStatements$;
}
else
{
$ElseStatements$;
}
替换模板:
if ($Expr$) {
$ThenStatements$;
}
else {
$ElseStatements$;
}
如果模板引擎不能区分两个模板,我将面临的问题是。它让我用正确的模板替换搜索模板,但它也会将"正确"的模板检测为错误的模板。
有没有办法使用某种正则表达式来解决这个问题?
编辑:在Android Studio上工作。我正试图为我的公司生成一组lint规则代码样式约定,这些规则将显示为警告或错误
我相信适合这项工作的工具是代码格式化程序。
我猜想这就是我们所说的Java。
调整格式化程序设置:
- 转到"设置"->"编辑器"->"代码样式"->"Java"->(选项卡)"环绕和括号"
- 将项目"支架放置/其他"设置为:行的末尾
- 检查预览是否为所需设置
- 单击"确定"
格式化(所有)代码:
- 选择根程序包
- 单击Alt+L(菜单:"代码"->"重新格式化代码")
- 出现"重新格式化代码"对话框,单击"确定"
所有的代码都应该按照规则重新格式化。
结构搜索&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
。