都说最近流行的ChatGPT将来会取代很多行业,也包括了码农。对于这点小编还不能确定。但是在我们还没被取代的时候。其实我们可以利用他来辅助我们平常的开发。
现在讲一下我的使用心得。
在开发过程中,有一次客户给了一个2W多字节一个表达式,由于里面有大量的括号,导致很难看清里面的逻辑。从而想要格式化下表达式。在网上找了很多格式化工具,都没有找到这种格式括号的工具。而自己去写的话,又感觉太浪费时间。从而想到了让ChatGPT去帮我写个方法能格式化这个表达式。
我先截取表达式其中的一小断出来分享。
((key1:(B23B* OR B23C* OR B23D* OR B23F*)) OR ((key1:(G05B19* OR G05B13* OR G05B15* OR G05B19*)) AND (key2:("CNC tool" OR "CNC machine" OR "NC machine" OR "NC tools"))) OR ((key1:(K35B19/18* OR K35B19/19* OR K35B19/2*)) NOT (key1:(G05B19/418*))))OR(((key3:(模具 OR 成型 OR 铸造)) AND (key1:((29C*) OR key1:(21D*) OR key1:(B29L*))) AND (key3:(高端 OR 精密)) AND (key1:((B29C*) OR key1:(B21D*) OR key1:(B21K *) OR key1:(B29L*)*))) OR (key3:(模具 OR 成型 OR 铸造) AND key3:(高端 OR 精密)))
现在看我是如何让ChatGPT帮忙写出自己想要的方法。
我一开始提问了:java输入一个有很多小括号的字符串,求输出格式化后美观的字符串。
结果显而易见,对方给出的方法不是我想要的。
![](https://i-blog.csdnimg.cn/blog_migrate/ebb1c2ebaff18c7eca00f1f88705bed1.png)
接着我又在问题中添加了我的要求
![](https://i-blog.csdnimg.cn/blog_migrate/c845ff3e6c0365ba23ae83753462b961.png)
而调用这个方法得到的结果是:
((
key1:(B23B* OR B23C* OR B23D* OR B23F*)
) OR (
(key1:(
G05B19* OR G05B13* OR G05B15* OR G05B19*
)) AND (key2:(
"CNC tool" OR "CNC machine" OR "NC machine" OR "NC tools"
))
) OR (
(key1:(
K35B19/18* OR K35B19/19* OR K35B19/2*
)) NOT (key1:(
G05B19/418*
))
))OR((
(key3:(
模具 OR 成型 OR 铸造
)) AND (key1:(
(29C*) OR key1:(21D*) OR key1:(B29L*)
)) AND (key3:(
高端 OR 精密
)) AND (key1:(
(B29C*) OR key1:(B21D*) OR key1:(B21K *) OR key1:(B29L*)*
))
) OR (
key3:(模具 OR 成型 OR 铸造) AND key3:(高端 OR 精密)
))
这虽然有格式化了,但是还达不到我的要求。于是接着让他优化
![](https://i-blog.csdnimg.cn/blog_migrate/54f1977cf9124590da1e778b9bb5ed42.png)
得到的结果是
((
key1:(
B23B* OR B23C* OR B23D* OR B23F*
)
) OR (
(
key1:(
G05B19* OR G05B13* OR G05B15* OR G05B19*
)
) AND (
key2:(
"CNC tool" OR "CNC machine" OR "NC machine" OR "NC tools"
)
)
) OR (
(
key1:(
K35B19/18* OR K35B19/19* OR K35B19/2*
)
) NOT (
key1:(
G05B19/418*
)
)
))OR((
(
key3:(
模具 OR 成型 OR 铸造
)
) AND (
key1:(
(
29C*
) OR key1:(
21D*
) OR key1:(
B29L*
)
)
) AND (
key3:(
高端 OR 精密
)
) AND (
key1:(
(
B29C*
) OR key1:(
B21D*
) OR key1:(
B21K *
) OR key1:(
B29L*
)*
)
)
) OR (
key3:(
模具 OR 成型 OR 铸造
) AND key3:(
高端 OR 精密
)
))
他说是要用递归的方法来调用。可是还是不明白怎么调用,于是接着问
![](https://i-blog.csdnimg.cn/blog_migrate/13ea3e285f77a5513c7ae88f82eeb062.png)
到现在还是没有得到我想要的结果。那我们就继续再问下去。
![](https://i-blog.csdnimg.cn/blog_migrate/84906a488fd30ca9251d7870bc2b7130.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2fe89fcd15cee4fab6214b958f850a9.png)
这里由于他提供的方法比较长,不好截图。所以最后会提供这个方法的完整版。
而使用这个方法最终得到的结果是
(
(
key1:(
B23B* OR B23C* OR B23D* OR B23F*)) OR (
(
key1:(
G05B19* OR G05B13* OR G05B15* OR G05B19*)) AND (
key2:(
"CNC tool" OR "CNC machine" OR "NC machine" OR "NC tools"))) OR (
(
key1:(
K35B19/18* OR K35B19/19* OR K35B19/2*)) NOT (
key1:(
G05B19/418*))))OR(
(
(
key3:(
模具 OR 成型 OR 铸造)) AND (
key1:(
(
29C*) OR key1:(
21D*) OR key1:(
B29L*))) AND (
key3:(
高端 OR 精密)) AND (
key1:(
(
B29C*) OR key1:(
B21D*) OR key1:(
B21K *) OR key1:(
B29L*)*))) OR (
key3:(
模具 OR 成型 OR 铸造) AND key3:(
高端 OR 精密)))
这个结果可以符合心目中的要求了。
所以好用的工具都是你自己一步步调教出来的。
下面是ChatGPT提供的最终方法以及调用方式。
public static void main(String[] args) {
String str = "((key1:(B23B* OR B23C* OR B23D* OR B23F*)) OR ((key1:(G05B19* OR G05B13* OR G05B15* OR G05B19*)) AND (key2:(\"CNC tool\" OR \"CNC machine\" OR \"NC machine\" OR \"NC tools\"))) OR ((key1:(K35B19/18* OR K35B19/19* OR K35B19/2*)) NOT (key1:(G05B19/418*))))OR(((key3:(模具 OR 成型 OR 铸造)) AND (key1:((29C*) OR key1:(21D*) OR key1:(B29L*))) AND (key3:(高端 OR 精密)) AND (key1:((B29C*) OR key1:(B21D*) OR key1:(B21K *) OR key1:(B29L*)*))) OR (key3:(模具 OR 成型 OR 铸造) AND key3:(高端 OR 精密))) ";
System.out.println(formatExpression(str, 2));
}
public static String formatExpression(String expression, int indentLevel) {
StringBuilder sb = new StringBuilder();
int currentIndentLevel = indentLevel;
boolean isInParenthesis = false;
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') {
sb.append(c);
isInParenthesis = true;
currentIndentLevel += 2;
if (i + 1 < expression.length() && expression.charAt(i + 1) != '\n') {
sb.append('\n');
sb.append(String.join("", Collections.nCopies(currentIndentLevel, " ")));
}
} else if (c == ')') {
isInParenthesis = false;
currentIndentLevel -= 2;
if (sb.charAt(sb.length() - 1) == ' ') {
sb.deleteCharAt(sb.length() - 1);
}
sb.append(c);
} else if (c == ',' && isInParenthesis) {
sb.append(c);
if (i + 1 < expression.length() && expression.charAt(i + 1) != '\n') {
sb.append('\n');
sb.append(String.join("", Collections.nCopies(currentIndentLevel, " ")));
}
} else {
sb.append(c);
}
}
return sb.toString();
}