對於我正在處理的代碼生成工具,我需要一個字符串並從中生成一個有效的Java變量名稱,但我不確定要執行此操作的最佳方式。將字符串轉換爲有效的Java變量名稱
例如:
"123 this is some message !"
=>_123_this_is_some_message
(或類似的東西)
感謝
對於我正在處理的代碼生成工具,我需要一個字符串並從中生成一個有效的Java變量名稱,但我不確定要執行此操作的最佳方式。將字符串轉換爲有效的Java變量名稱
例如:
"123 this is some message !"
=>_123_this_is_some_message
(或類似的東西)
感謝
假設你用_
替換所有無效字符,就像下面的代碼可以工作(粗略的例子)。您可能要增加一些邏輯名稱衝突等,這是基於on the 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);
}
這很有幫助,謝謝@assylias –
不如附加''_''(char而不是字符串'「_」')。 – NateS
你想隨機字符串轉換成有效的Java標識符。根據the Java Language Specification, §3.8,標識符的定義如下:
標識符:
IdentifierChars但不是關鍵字或BooleanLiteral或NullLiteralIdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigitJavaLetter:
任何Unicode字符是一個Java字母JavaLetterOrDigit:
任何Unicode字符是一個Java字母或數字
A你必須這樣做,然後,逐步完成你的輸入並用有效的字符替換任何無效的字符。下劃線)或完全刪除它。 Java甚至提供了Character
類中的方法,告訴您給定的字符是否是JavaLetter或JavaLetterOrDigit:isJavaIdentifierStart()
和isJavaIdentifierPart
。 (這比試圖排除無效字符容易得多,因爲有效字符集很小,而無效字符集很大。)
最後,請記住確保結果不以數字開頭沒有留下關鍵字或文字。如果碰撞可能並且不合需要,您可以根據需要在結果中附加數字以獲取唯一值。
輸入字符串的可能內容是什麼?只有字母數字,標點和空格?一切都在Unicode? – Pops
如果不對輸入施加規則,我想你會發現衝突(即多對一映射)。根據你的申請,這可能或可能不重要。 – jpm
如果它是Java變量名的有效字符,則可以嘗試循環訪問String並附加到StringBuilder。您可能遇到的挑戰是重複的變量,因此您可能需要跟蹤所使用的內容並在必要時追加數字。 – JustinKSU