2011-07-05 36 views
46

: ("ruột") có một ý nghĩa đặc biệt trong regexp Nhưng tôi cần phải sử dụng nó như là, như [A-Za-z0-9.,-:]* tôi đã cố gắng để thoát khỏi nó, nhưng điều này không làm việc [A-Za-z0-9.,-\:]*Cách nhập ":" ("dấu hai chấm") vào regexp?

+4

Có thể bạn cần hai dấu gạch chéo ngược để thoát khỏi nó? – Mehrdad

+0

Bạn đang cố gắng gì để phù hợp? –

Trả lời

86

Trong hầu hết các triển khai regex (bao gồm cả Java), : không có ý nghĩa đặc biệt, cả bên trong lẫn bên ngoài lớp ký tự.

Vấn đề của bạn rất có thể là do thực tế các - hoạt động như một nhà điều hành phạm vi trong lớp học của bạn:

[A-Za-z0-9.,-:]* 

nơi ,-: trận đấu tất cả các ký tự ascii giữa ','':'. Lưu ý rằng nó vẫn khớp với số ':' theo nghĩa đen!

Hãy thử điều này thay vì:

[A-Za-z0-9.,:-]* 

Bằng cách đặt - vào đầu hoặc cuối của lớp, nó phù hợp với nghĩa đen "-". Như đã đề cập trong các ý kiến ​​của Keoki Zee, bạn cũng có thể thoát ra khỏi lớp - bên trong lớp, nhưng hầu hết mọi người chỉ cần thêm nó vào cuối.

Một bản demo:

public class Test { 
    public static void main(String[] args) { 
     System.out.println("8:".matches("[,-:]+"));  // true: '8' is in the range ','..':' 
     System.out.println("8:".matches("[,:-]+"));  // false: '8' does not match ',' or ':' or '-' 
     System.out.println(",,-,:,:".matches("[,:-]+")); // true: all chars match ',' or ':' or '-' 
    } 
} 
+2

Bạn cũng có thể thoát dấu nối bằng dấu gạch chéo ngược, '[a \ -z]'. –

+1

@Keoki: đúng, mặc dù tôi tìm thấy nó rõ ràng hơn để làm như thoát ít (thoát kép bên trong literals chuỗi Java!) Càng tốt. Tuy nhiên, tốt nhất nên đề cập đến một _can_ cũng thoát khỏi nó. –

+3

Đặt dấu nối ở cuối có lẽ là những gì mà lập trình viên trước đã làm, dẫn đến lỗi này. Tôi * luôn luôn * thoát khỏi nó: kết thúc chu kỳ ':)' – Kobi

4

Colon không có ý nghĩa đặc biệt trong một lớp nhân vật và không cần phải trốn thoát. Theo the PHP regex docs, các nhân vật duy nhất mà cần phải được thoát trong một lớp nhân vật như sau:

Tất cả các ký tự không phải chữ và số khác hơn \, -, ^ (lúc bắt đầu) và chấm dứt ] là không đặc biệt trong các lớp nhân vật nhưng không có hại nếu chúng bị loại bỏ.

Để biết thêm thông tin về biểu thức chính quy Java, hãy xem the docs.

+0

Tôi không hiểu tại sao điều này có một downvote, ai đó có thể giải thích cho tôi những gì có thể sai với câu trả lời này xin vui lòng? –

+2

Tôi đã không bỏ phiếu xuống nhưng có thể vì bạn liên kết tài liệu PHP regex trong một câu hỏi regex Java? – hcpl

1

sử dụng \\: thay vì \: .. \ có ý nghĩa đặc biệt trong chuỗi java.

+2

Mặc dù dấu gạch chéo ngược là một ký tự thoát trong chuỗi Java, nhưng thoát khỏi dấu gạch chéo ngược ở đây sẽ không giải quyết được vấn đề, vì ':' không phải là một char đặc biệt trong regex. –

7

Hãy cẩn thận, - có một ý nghĩa đặc biệt với regexp. Trong một [], bạn có thể đặt nó mà không có vấn đề nếu nó được đặt ở cuối. Trong trường hợp của bạn, ,-: được lấy làm từ , đến :.

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