Làm thế nào để viết lại [a-zA-Z0-9!$* \t\r\n]
mẫu để khớp với gạch nối cùng với các ký tự hiện có?
Làm thế nào để viết lại [a-zA-Z0-9!$* \t\r\n]
mẫu để khớp với gạch nối cùng với các ký tự hiện có?
Câu trả lời:
Thoát khỏi dấu gạch nối.
[a-zA-Z0-9!$* \t\r\n\-]
CẬP NHẬT :
Đừng bận tâm đến câu trả lời này - bạn có thể thêm dấu gạch nối vào nhóm nhưng bạn không cần phải thoát khỏi nó. Xem câu trả lời Konrad Rudolph thay mà làm một công việc tốt hơn nhiều để trả lời và giải thích lý do tại sao.
Dấu gạch nối thường là một ký tự bình thường trong biểu thức chính quy. Chỉ khi nó nằm trong một lớp ký tự và giữa hai ký tự khác thì nó mới có ý nghĩa đặc biệt.
Như vậy:
[-]
khớp với dấu gạch ngang.[abc-]
trận đấu a
, b
, c
hoặc gạch ngang.[-abc]
trận đấu a
, b
, c
hoặc gạch ngang.[ab-d]
trận đấu a
, b
, c
hoặc d
( duy nhất ở đây là gạch nối biểu thị một dãy ký tự).[a-c-e]
: điều này đơn giản là không hợp lệ trong một số thông số kỹ thuật / động cơ regex. Ví dụ: POSIX regex không cho phép nó.
Sẽ ít gây nhầm lẫn hơn khi luôn sử dụng dấu gạch nối thoát khỏi, để nó không phải phụ thuộc vào vị trí. Đó là một \-
bên trong lớp ký tự được đánh dấu ngoặc.
Nhưng có một cái gì đó khác để xem xét. Một số ký tự được liệt kê có thể được viết theo cách khác. Trong một số trường hợp, họ chắc chắn nên làm như vậy.
Sự so sánh các hương vị regex này nói rằng C♯ có thể sử dụng một số thuộc tính Unicode đơn giản hơn. Nếu bạn đang xử lý Unicode, bạn có thể nên sử dụng danh mục chung \p{L}
cho tất cả các chữ cái có thể có, và có thể \p{Nd}
cho các số thập phân. Ngoài ra, nếu bạn muốn chứa tất cả các dấu câu gạch ngang đó, không chỉ HYPHEN-MINUS, bạn nên sử dụng thuộc \p{Pd}
tính. Bạn cũng có thể muốn viết chuỗi ký tự khoảng trắng đó đơn giản \s
, giả sử rằng điều đó không quá chung chung đối với bạn.
Tất cả cùng nhau, điều đó hoạt động [\p{L}\p{Nd}\p{Pd}!$*]
để phù hợp với bất kỳ ký tự nào từ tập hợp đó.
Tôi có khả năng sẽ sử dụng nó, ngay cả khi tôi không có kế hoạch xử lý bộ Unicode đầy đủ, bởi vì đó là một thói quen tốt để tham gia và bởi vì những thứ này thường phát triển vượt ra ngoài các thông số ban đầu của chúng. Bây giờ khi bạn nhấc nó lên để sử dụng trong mã khác, nó vẫn hoạt động bình thường. Nếu bạn cố gắng mã tất cả các ký tự, nó sẽ không.
[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] + và cả [az-0-9] + đều giống nhau. Dấu gạch ngang giữa hai phạm vi được coi là a Và cũng có [a-z0-9 - + ()] + regex này cho phép dấu gạch ngang.
sử dụng "\ p {Pd}" không có dấu ngoặc kép để khớp với bất kỳ loại dấu gạch nối nào. Ký tự '-' chỉ là một loại dấu gạch nối cũng là một ký tự đặc biệt trong Regex.