对于我正在处理的代码生成工具,我需要获取一个字符串并从中生成一个有效的java变量名,但我不确定最好的方法。
例如:
"123 this is some message !"
=> _123_this_is_some_message
(或类似的东西)
由于
答案 0 :(得分:8)
假设您用_
替换所有无效字符,例如下面的代码可能会起作用(粗略示例)。您可能希望为名称冲突等添加一些逻辑。它基于on the JLS #3.8:
标识符是Java字母和Java数字的无限长度序列,第一个必须是Java字母 [...]
“Java letter”是Character.isJavaIdentifierStart(int)方法返回true的字符。
“Java letter-or-digit”是Character.isJavaIdentifierPart(int)方法返回true的字符。
public static void main(String[] args) {
String s = "123 sdkjh s;sdlkjh d";
StringBuilder sb = new StringBuilder();
if(!Character.isJavaIdentifierStart(s.charAt(0))) {
sb.append("_");
}
for (char c : s.toCharArray()) {
if(!Character.isJavaIdentifierPart(c)) {
sb.append("_");
} else {
sb.append(c);
}
}
System.out.println(sb);
}
答案 1 :(得分:4)
您希望将随机字符串转换为有效的Java标识符。根据{{3}},标识符的定义如下:
标识符:
IdentifierChars 但不是关键字或 BooleanLiteral 或 NullLiteralIdentifierChars :
JavaLetter
IdentifierChars JavaLetterOrDigitJavaLetter :
任何Unicode字符,即Java字母JavaLetterOrDigit :
任何Unicode字符,即Java字母或数字
然后,您只需逐步执行输入并将任何无效字符替换为有效字符(例如下划线)或完全删除它。 Java甚至在Character
类中提供方法,告诉您给定字符是 JavaLetter 还是 JavaLetterOrDigit :isJavaIdentifierStart()
和{{1} }。 (这比尝试排除无效字符容易得多,因为有效字符集很小而且无效字符集很大。)
最后,请务必确保您的结果不会以未包含关键字或文字的数字开头。如果碰撞是可能的并且是不希望的,您可以根据需要在结果中附加数字以获得唯一值。
答案 2 :(得分:1)
你应该:
\\s+
替换为_
\\W+
_
匹配(或者即使不匹配)^\d
作为前缀
醇>
类似
"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")