2010-01-23 32 views
6

tôi đã regex này trong java rằng phù hợp hoặc là một nhân vật tự chữ và số hoặc dấu ngã (~)Matching '_' và '-' trong java regexes

^([a-z0-9])+|~$

Bây giờ tôi phải thêm cũng là nhân vật -_ tôi đã thử một vài kết hợp, không phải trong đó làm việc, ví dụ:

^([a-zA-Z0-9_-])+|~$ ^([a-zA-Z0-9]|-|_)+|~$

mẫu chuỗi đầu vào mà phải phù hợp:

woZOQNVddd

ncnW0mL14-

dEowBO_Eu7

7MyG4XqFz-

A8ft-y6hDu ~

Bất kỳ manh mối/gợi ý nào?

+0

Ông có thể cung cấp cho chúng tôi một số mẫu thử nghiệm? Các giải pháp của bạn có vẻ đúng. Đã thêm – Leo

+0

mẫu.Lưu ý rằng tôi đã thêm A-Z để khớp các chữ hoa –

+0

Thiên Chúa tôi ghét các regex trong java: @ –

Trả lời

7

- là ký tự đặc biệt trong dấu ngoặc vuông. Nó chỉ ra một phạm vi. Nếu nó không phải ở một trong hai đầu của regex nó cần phải được thoát bằng cách đặt một \ trước khi nó.

Đó là giá trị chỉ ra một phím tắt: \w tương đương với [0-9a-zA-Z_] vì vậy tôi nghĩ rằng đây là dễ đọc hơn:

^([\w-]+|~$ 
+0

Thực ra tôi đã có lỗi đánh máy. Nó hoạt động, nhờ –

+0

+1 - Bằng cách nào đó nó đã thoát (không có ý định chơi chữ) thông báo của tôi rằng '\ w' cũng sẽ khớp với một ký tự' _'. Tôi đoán đó là vì vậy chúng tôi có thể sử dụng nó để phù hợp với tên biến thực sự xấu. –

+1

@Bill: nó thường bị lãng quên hoặc không được biết đến. Đó là một điều kì lạ. Tôi nghĩ rằng tôi muốn nếu đó không phải là trường hợp vì tôi đã không sử dụng '\ w' nhiều lần vì nó, nhưng nó dễ dàng để làm' \ w_' nếu bạn đã có. Và tôi nghĩ hầu hết thời gian bạn không quan tâm đến '_'. – cletus

3

Bạn cần phải thoát khỏi -, như \-, vì đó là một ký tự đặc biệt (toán tử dải ô). _ là ok.

Vì vậy, ^([a-z0-9_\-])+|~$.

Sửa: bạn Chuỗi đầu vào cuối cùng sẽ không phù hợp bởi vì các biểu thức chính quy bạn đang sử dụng diêm một chuỗi ký tự chữ và số (cộng -_) HOẶC dấu ngã (vì đường ống). Nhưng không phải cả hai. Nếu bạn muốn cho phép một dấu ngã tùy chọn ở cuối dòng, thay đổi để:

^([a-z0-9_\-])+(~?)$

+0

Hoặc bạn có thể đặt dấu gạch ngang làm ký tự đầu tiên cho trình phân tích cú pháp không xem xét nó là dấu phân tách dải ô. –

+0

Đã thử sử dụng '^ ([a-zA-Z0-9 _ \\ -]) + | ~ $'. Không hoạt động –

+0

@Max đã thử '^ ([- a-zA-Z0-9 _]) + | ~ $'. Không hoạt động –

3

Nếu bạn đặt - đầu tiên, nó sẽ không được hiểu là chỉ số phạm vi.

^([-a-zA-Z0-9_])+|~$ 

này phù hợp với tất cả các ví dụ của bạn ngoại trừ người cuối cùng sử dụng đoạn mã sau:

String str = "A8ft-y6hDu ~"; 
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$")); 

Đó ví dụ cuối cùng sẽ không phù hợp bởi vì nó không phù hợp với mô tả của bạn. Regex sẽ khớp với bất kỳ tổ hợp chữ và số nào, - và _, HOẶC ký tự ~.

+0

không thành công tại 'ncnW0mL14-' –

+0

Đó là vì tôi chưa thêm A-Z. Nó phù hợp với bây giờ. –

+0

Thanks @ill nó hoạt động! (Tôi đang sử dụng @ cletus vì nó gọn gàng hơn) –

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