gpt4 book ai didi

java - 下划线转为驼峰式大小写,某些前缀除外

转载 作者:行者123 更新时间:2023-11-30 03:27:12 25 4
gpt4 key购买 nike

我目前正在创建一个 Java 程序来重写我们软件中的一些过时的 Java 类。转换的一部分包括将变量名称从包含下划线更改为使用驼峰命名法。问题是,我不能简单地替换代码中的所有下划线。我们有一些带有常量的类,对于这些常量,下划线应该保留。
如何用 stringLabel 替换 string_label 等实例,但不要替换前缀“Parameters”后面出现的下划线。

我目前正在使用以下内容,显然不能处理排除某些前缀的情况:

public String stripUnderscores(String line) { 
Pattern p = Pattern.compile("_(.)");
Matcher m = p.matcher(line);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, m.group(1).toUpperCase());
}
m.appendTail(sb);
return sb.toString();
}

最佳答案

您可以尝试以下操作:

Pattern.compile("(?<!(class\\s+Parameters.+|Parameters\\.[\\w_]+))_(.)")

使用 negative lookbehind .

使用某种理解范围语义的重构工具可能会更好。

如果您检查的只是一个限定名称,例如 Parameters.is_module_installed那么你将替换

class Parameters {
static boolean is_module_installed;
}

误打误撞。像这样的极端情况还有很多。 ( import static Parameters.*; 等)

单独使用正则表达式对我来说似乎很麻烦。使例程变得更智能的一种方法是使用正则表达式来捕获标识符的表达式,然后您可以单独检查它:

static List<String> exclude = Arrays.asList("Parameters");

static String getReplacement(String in) {
for(String ex : exclude) {
if(in.startsWith(ex + "."))
return in;
}

StringBuffer b = new StringBuffer();
Matcher m = Pattern.compile("_(.)").matcher(in);
while(m.find()) {
m.appendReplacement(b, m.group(1).toUpperCase());
}

m.appendTail(b);
return b.toString();
}

static String stripUnderscores(String line) {
Pattern p = Pattern.compile("([_$\\w][_$\\w\\d]+\\.?)+");
Matcher m = p.matcher(line);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, getReplacement(m.group()));
}
m.appendTail(sb);
return sb.toString();
}

但这仍然会失败,例如class Parameters { is_module_installed; } .

通过进一步分解每个表达式可以使其更加健壮:

static String getReplacement(String in) {
if(in.contains(".")) {
StringBuilder result = new StringBuilder();

String[] parts = in.split("\\.");

for(int i = 0; i < parts.length; ++i) {
if(i > 0) {
result.append(".");
}

String part = parts[i];

if(i == 0 || !exclude.contains(parts[i - 1])) {
part = getReplacement(part);
}

result.append(part);
}

return result.toString();
}

StringBuffer b = new StringBuffer();
Matcher m = Pattern.compile("_(.)").matcher(in);
while(m.find()) {
m.appendReplacement(b, m.group(1).toUpperCase());
}

m.appendTail(b);
return b.toString();
}

这可以处理类似的情况

Parameters.a_b.Parameters.a_b.c_d

和输出

Parameters.a_b.Parameters.a_b.cD

这是不可能的 Java 语法,但我希望你明白我的意思。自己做一些解析会有很大帮助。

关于java - 下划线转为驼峰式大小写,某些前缀除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29924166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com