如何将任意字符串转换为Java标识符?

par*_*ier 11 java string code-generation identifier

我需要转换任意字符串:

  • 带空格的字符串
  • 100stringsstartswithnumber
  • 字符串€有%的特别†字符/ \!
  • [空字符串]

到有效的Java标识符:

  • string_with_spaces
  • _100stringsstartswithnumber
  • string_with_special_characters___
  • _

是否有现有的工具可用于此任务?

有了这么多Java源代码重构/生成框架,人们会认为这应该是非常常见的任务.

Boh*_*ian 12

这个简单的方法将任何输入字符串转换为有效的java标识符:

public static String getIdentifier(String str) {
    try {
        return Arrays.toString(str.getBytes("UTF-8")).replaceAll("\\D+", "_");
    } catch (UnsupportedEncodingException e) {
        // UTF-8 is always supported, but this catch is required by compiler
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

"%^&*\n()" --> "_37_94_38_42_10_56_94_40_41_"
Run Code Online (Sandbox Code Playgroud)

任何输入字符都可以使用 - 外语字符,换行符,任何东西!
另外,这个算法是:

  • 重复性
  • 独特的-即会永远产生相同的结果,如果str1.equals(str2)
  • 可逆

感谢Joachim Sauer提出的UTF-8建议


如果冲突正常(两个输入字符串可能产生相同的结果),则此代码生成可读输出:

public static String getIdentifier(String str) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if ((i == 0 && Character.isJavaIdentifierStart(str.charAt(i))) || (i > 0 && Character.isJavaIdentifierPart(str.charAt(i))))
            sb.append(str.charAt(i));
        else
            sb.append((int)str.charAt(i));
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

它保留有效标识符的字符,仅将那些无效的字符转换为其十进制等值.

  • 从Java 7开始,您可以使用[nio.charset.StandardCharsets](http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html)来避免_try-catch_块.`Arrays.toString(str.getBytes(StandardCharsets.UTF_8)).replaceAll("\\ D +","_");` (3认同)
  • 如果这应该是可重现的和稳定的,那么`getBytes()`应该接受一个参数(我建议``UTF-8"`). (2认同)