7

对于我正在使用的代码生成工具,我需要获取一个字符串并从中生成一个有效的 java 变量名,但我不确定最好的方法。

例如:

"123 this is some message !"=> _123_this_is_some_message(或类似的东西)

谢谢

4

3 回答 3

11

假设您用下面的代码替换所有无效字符_可能会起作用(粗略示例)。您可能想要为名称冲突等添加一些逻辑。它基于JLS #3.8

标识符是 Java 字母和 Java 数字的无限长度序列,其中第一个必须是 Java 字母。
[...]
“Java 字母”是 Character.isJavaIdentifierStart(int) 方法返回 true 的字符。
“Java 字母或数字”是 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);
}
于 2012-10-05T21:49:18.960 回答
4

您希望将随机字符串转换为有效的 Java 标识符。根据Java 语言规范 §3.8,标识符的定义如下:

Identifier :
IdentifierChars但不是关键字BooleanLiteralNullLiteral

IdentifierChars :
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter :
任何作为 Java 字母的 Unicode 字符

JavaLetterOrDigit :
任何作为 Java 字母或数字的 Unicode 字符

那么,您所要做的就是逐步检查您的输入并将任何无效字符替换为有效字符(例如下划线)或将其完全删除。Java 甚至在Character类中提供方法来告诉您给定字符是JavaLetter还是JavaLetterOrDigit :isJavaIdentifierStart()isJavaIdentifierPart. (这比尝试排除无效字符要容易得多,因为有效字符集很小,而无效字符集很大。)

最后,请记住确保您的结果不是以数字开头,而不是关键字或文字。如果冲突是可能的且不希望发生,您可以根据需要在结果中附加数字以获得唯一值。

于 2012-10-05T21:48:38.163 回答
1

你应该:

  1. 替换\\s+_
  2. 删除所有出现的\\W+
  3. 添加_为前缀,如果^\d匹配(或者即使不匹配)

所以像

"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")
于 2012-10-05T21:51:11.347 回答