我正在开发一款代码生成工具,需要将一个字符串转化为Java可用的变量名,但是我不确定最好的方法是什么。
例如:
"123 this is some message !"
=> _123_this_is_some_message
(或类似名称)
谢谢!
我正在开发一款代码生成工具,需要将一个字符串转化为Java可用的变量名,但是我不确定最好的方法是什么。
例如:
"123 this is some message !"
=> _123_this_is_some_message
(或类似名称)
谢谢!
假设您将所有无效字符替换为_
,则以下代码可以工作(粗略示例)。您可能需要添加一些逻辑来处理名称冲突等。它基于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);
}
'_'
(而不是字符串 "_"
)的字符。 - NateS然后,您需要逐个检查输入并将任何无效字符替换为有效字符(例如下划线)或完全删除它。 Java甚至提供了标识符:
标识符字符但不是关键字或布尔字面值或空字面值标识符字符:
Java字母
标识符字符 Java字母或数字Java字母:
任何Unicode字符都是Java字母Java字母或数字:
任何Unicode字符都是Java字母或数字
Character
类中的方法,告诉您给定字符是否是Java字母或Java字母或数字: isJavaIdentifierStart()
和isJavaIdentifierPart
。(这比尝试排除无效字符要容易得多,因为有效字符集很小,而无效字符集很大。)您应该:
\\s+
替换为_
\\W+
^\d
(或即使不匹配),则添加_
作为前缀因此,类似于以下内容:
"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")
\W
еә”иҜҘжҳҜUnicodeж„ҹзҹҘзҡ„пјҢеӣ жӯӨйқһеёёйҖӮеҗҲдҪңдёәйқһж ҮиҜҶз¬Ұеӯ—з¬Ұзҡ„е®ҡд№үгҖӮ - Joey
isJavaIdentifierPart()
和相关函数应该会有所帮助。 - millimoose