2010-08-26 35 views
5

Tôi gặp sự cố khi xác định tên gói Java hợp lệ bằng Python. Đây là mã:Python regex cho tên gói Java

packageName = "com.domain.lala" # valid, not rejected -> correct 
    #packageName = ".com.domain.lala" # invalid, rejected -> correct 
    #packageName = "com..domain.lala" # invalid, not rejected -> incorrect 
    #packageName = "com.domain.lala." # invalid, not rejected -> incorrect 

    matchObject = re.match("([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)", 
          packageName) 

    if matchObject is not None: 
     print packageName + " is a package name!" 
    else: 
     print packageName + " is *not* a package name!" 
     Utilities.show_error("Invalid Package Name", "Invalid package name " + packageName + "!", "Ok", "", "") 

Tên gói phải bắt đầu bằng chữ thường hoặc dấu gạch dưới và mỗi dấu chấm phải được theo sau ít nhất một chữ thường hoặc gạch dưới một lần nữa. Tất cả các ký tự khác có thể là chữ thường, chữ số hoặc dấu gạch dưới. Không cho phép chạy các dấu chấm và nó có thể không kết thúc bằng hoặc bắt đầu bằng dấu chấm.

Làm cách nào để giải quyết vấn đề này?

Trả lời

4

Thêm $ vào cuối regex để buộc khớp với chuỗi đầy đủ. Ngay bây giờ nó chỉ phù hợp với một phần chuỗi, do đó, nó không chính xác chấp nhận tên gói hợp lệ có thêm rác ở cuối.

0

Bạn có thể phân tích các chuỗi thay vì:

def valid_java_package_name(string): 
    tree = string.split('.') 

    if len(tree) == 0: 
     return false 

    for node in tree: 
     if not valid_java_package_node(node): 
      return false 

    return true 
2

Bạn cần phải đặt sự bắt đầu của dòng và kết thúc của các marker dòng. Vì vậy, regex sẽ trông giống như -

^([a-z_]{1}[a-z0-9_]*(\.[a-z_]{1}[a-z0-9_]*)*)$ 
+0

Bạn không cần điểm đánh dấu bắt đầu khi sử dụng 're.match'. – interjay

+0

@@ interjay ohh .. Tôi không phải là một anh chàng python. Đây là regex chung. – Gopi

3

Chữ hoa thường được cho phép trong tên gói Java. Họ chỉ là nản lòng nhưng nó hoạt động.

Các regex nên là:

^([a-zA-Z_]{1}[a-zA-Z0-9_]*(\\.[a-zA-Z_]{1}[a-zA-Z0-9_]*)*)?$ 
2

Pattern dưới đây làm việc tốt cho tôi:

/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/i; 

Các kết quả có thể được tìm thấy trong gist này.

[✔] me.unfollowers.droid 
[✔] me_.unfollowers.droid 
[✔] me._unfollowers.droid 
[✔] me.unfo11llowers.droid 
[✔] me11.unfollowers.droid 
[✔] m11e.unfollowers.droid 
[✗] 1me.unfollowers.droid 
[✔] me.unfollowers23.droid 
[✔] me.unfollowers.droid23d 
[✔] me.unfollowers_.droid 
[✔] me.unfollowers._droid 
[✔] me.unfollowers_._droid 
[✔] me.unfollowers.droid_ 
[✔] me.unfollowers.droid32 
[✗] me.unfollowers.droid/ 
[✗] me:.unfollowers.droid 
[✗] :me.unfollowers.droid 
[✗] me.unfollowers.dro;id 
[✗] me.unfollowe^rs.droid 
[✗] me.unfollowers.droid. 
[✗] me.unfollowers..droid 
[✗] me.unfollowers.droid._ 
[✔] me.unfollowers.11212 
[✔] me.1.unfollowers.11212 
[✗] me..unfollowers.11212 
[✗] abc 
[✗] abc. 
[✗] .abc