2012-10-05 69 views
5

對於我正在處理的代碼生成工具,我需要一個字符串並從中生成一個有效的Java變量名稱,但我不確定要執行此操作的最佳方式。將字符串轉換爲有效的Java變量名稱

例如:

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

感謝

+2

輸入字符串的可能內容是什麼?只有字母數字,標點和空格?一切都在Unicode? – Pops

+0

如果不對輸入施加規則,我想你會發現衝突(即多對一映射)。根據你的申請,這可能或可能不重要。 – jpm

+0

如果它是Java變量名的有效字符,則可以嘗試循環訪問String並附加到StringBuilder。您可能遇到的挑戰是重複的變量,因此您可能需要跟蹤所使用的內容並在必要時追加數字。 – JustinKSU

回答

7

假設你用_替換所有無效字符,就像下面的代碼可以工作(粗略的例子)。您可能要增加一些邏輯名稱衝突等,這是基於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); 
} 
+0

這很有幫助,謝謝@assylias –

+0

不如附加''_''(char而不是字符串'「_」')。 – NateS

3

你想隨機字符串轉換成有效的Java標識符。根據the Java Language Specification, §3.8,標識符的定義如下:

標識符
IdentifierChars但不是關鍵字BooleanLiteralNullLiteral

IdentifierChars
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter
任何Unicode字符是一個Java字母

JavaLetterOrDigit
任何Unicode字符是一個Java字母或數字

A你必須這樣做,然後,逐步完成你的輸入並用有效的字符替換任何無效的字符。下劃線)或完全刪除它。 Java甚至提供了Character類中的方法,告訴您給定的字符是否是JavaLetterJavaLetterOrDigitisJavaIdentifierStart()isJavaIdentifierPart。 (這比試圖排除無效字符容易得多,因爲有效字符集很小,而無效字符集很大。)

最後,請記住確保結果不以數字開頭沒有留下關鍵字或文字。如果碰撞可能並且不合需要,您可以根據需要在結果中附加數字以獲取唯一值。

1

您應該:

  1. 更換\\s+_
  2. 刪除的\\W+
  3. 所有出現添加_作爲前綴,如果^\d匹配(或者即使沒有)

所以像

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

這是相當嚴格的:許多有效的字符將被排除在你的要點2. – assylias

+0

@assylias =當然,我的答案只是一個基本思想,可以擴展... –

+0

assylias,請注意Java的'\ W'應該是Unicode因此非常適合非標識符字符的定義。 – Joey