2012-10-05 67 views
5

Đối với công cụ tạo mã tôi đang làm việc, tôi cần lấy một chuỗi và tạo tên biến java hợp lệ từ nó, nhưng tôi không chắc chắn về cách tốt nhất để làm điều đó .Chuyển đổi chuỗi thành tên biến Java hợp lệ

Ví dụ:

"123 this is some message !" =>_123_this_is_some_message (hoặc một cái gì đó tương tự)

Cảm ơn

+2

Nội dung có thể có của chuỗi đầu vào là gì? Chỉ chữ và số, dấu chấm câu và dấu cách? Tất cả mọi thứ trong Unicode? – Pops

+0

Không áp đặt các quy tắc về đầu vào, tôi nghĩ bạn sẽ tìm thấy các xung đột (tức là ánh xạ nhiều người). Tùy thuộc vào ứng dụng của bạn, điều này có thể hoặc có thể không quan trọng. – jpm

+0

Bạn có thể thử lặp qua chuỗi và nối thêm vào một StringBuilder nếu nó là một ký tự hợp lệ cho một tên biến Java. Thách thức bạn có thể có là các biến trùng lặp, vì vậy bạn có thể muốn theo dõi những gì bạn đã sử dụng và nối thêm số nếu cần. – JustinKSU

Trả lời

7

Giả sử bạn thay thế tất cả các ký tự không hợp lệ theo _ một cái gì đó giống như mã bên dưới có thể hoạt động (ví dụ thô). Bạn có thể muốn thêm một số logic cho va chạm tên vv Nó dựa trên on the JLS #3.8:

Mã định danh là chuỗi chữ cái Java và chữ số Java không giới hạn, chữ cái đầu tiên phải là một chữ cái Java.
[...]
"Chữ cái Java" là ký tự mà phương thức Character.isJavaIdentifierStart (int) trả về true.
"Chữ cái hoặc chữ cái Java" là một ký tự mà phương thức Character.isJavaIdentifierPart (int) trả về 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

Điều này hữu ích , nhờ @assylias –

+0

Cũng có thể nối thêm ''_'' (char thay vì một chuỗi' "_" '). – NateS

3

Bạn muốn chuyển đổi chuỗi ngẫu nhiên vào định danh Java hợp lệ. Theo the Java Language Specification, §3.8, định nghĩa về một định như sau:

Định danh:
IdentifierChars nhưng không phải là một từ khóa hoặc BooleanLiteral hoặc NullLiteral

IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter:
bất kỳ ký tự Unicode đó là một lá thư Java

JavaLetterOrDigit:
bất kỳ ký tự Unicode đó là một bức thư-hoặc chữ số Java

A bạn sẽ phải thực hiện, sau đó, đang thực hiện bước đầu vào của bạn và thay thế bất kỳ ký tự không hợp lệ nào bằng ký tự hợp lệ (ví dụ: gạch dưới) hoặc xóa hoàn toàn. Java thậm chí còn cung cấp các phương thức trong lớp Character cho bạn biết nếu một ký tự cụ thể là JavaLetter hoặc JavaLetterOrDigit: isJavaIdentifierStart()isJavaIdentifierPart. (Điều này dễ dàng hơn nhiều so với việc cố loại trừ các ký tự không hợp lệ vì tập hợp các ký tự hợp lệ nhỏ và tập hợp các ký tự không hợp lệ là rất lớn.)

Cuối cùng, hãy nhớ đảm bảo kết quả của bạn không bắt đầu bằng chữ số không phải với từ khóa hoặc chữ. Nếu xung đột là có thể và không mong muốn, bạn có thể nối thêm số vào kết quả của mình trên cơ sở cần thiết để có được các giá trị duy nhất.

1

Bạn nên:

  1. Thay \\s+ với _
  2. Hủy bỏ tất cả các lần xuất hiện của \\W+
  3. Thêm _ như tiền tố, nếu ^\d trận đấu (hoặc thậm chí nếu không muốn nói)

Vì vậy, một cái gì đó như

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

Điều này khá hạn chế: nhiều ký tự hợp lệ sẽ bị loại trừ theo quan điểm của bạn 2. – assylias

+0

@assylias = Chắc chắn câu trả lời của tôi chỉ là ý tưởng cơ bản, có thể mở rộng ... –

+0

assylias, lưu ý rằng '\ W' của Java phải là Unicode -Hướng và do đó phù hợp khá tốt định nghĩa của một nhân vật không nhận dạng. – Joey

Các vấn đề liên quan