将字符串转换为有效的Java变量名称

时间:2012-10-05 21:40:27

标签: java regex code-generation

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

例如:

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

由于

3 个答案:

答案 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 NullLiteral

     

IdentifierChars
           JavaLetter
           IdentifierChars JavaLetterOrDigit

     

JavaLetter
          任何Unicode字符,即Java字母

     

JavaLetterOrDigit
          任何Unicode字符,即Java字母或数字

然后,您只需逐步执行输入并将任何无效字符替换为有效字符(例如下划线)或完全删除它。 Java甚至在Character类中提供方法,告诉您给定字符是 JavaLetter 还是 JavaLetterOrDigit isJavaIdentifierStart()和{{1} }。 (这比尝试排除无效字符容易得多,因为有效字符集很小而且无效字符集很大。)

最后,请务必确保您的结果不会以未包含关键字或文字的数字开头。如果碰撞是可能的并且是不希望的,您可以根据需要在结果中附加数字以获得唯一值。

答案 2 :(得分:1)

你应该:

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

    类似

    "_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")