Làm cách nào để nối dấu gạch ngang với Cụm từ thông dụng?


81

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ó?


thay vì thêm không gian và \ t bạn có thể thêm \ s. \ s trận đấu loại không gian trắng cũng
Radu Simionescu

Câu trả lời:


71

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.


Oh là nó? Đó là bởi vì nó nằm trong một nhóm nhân vật? Lỗi của tôi.
Neil Barnwell

11
@KonradRudolph Bạn nói đúng, nhưng tôi không chắc phiên bản không thoát sẽ dễ hiểu hơn. Hai cách sử dụng có thể có của dấu gạch ngang là khó hiểu, đây là lý do tại sao có những câu hỏi về điều này để bắt đầu. Nó chắc chắn sẽ thanh lịch hơn khi bạn biết về nó, nhưng đối với người mới bắt đầu thì nó hơi khó hiểu.
Christophe Roussy

182

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ự 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, choặc gạch ngang.
  • [-abc]trận đấu a, b, choặc gạch ngang.
  • [ab-d]trận đấu a, b, choặc d( duy nhất ở đây là gạch nối biểu thị một dãy ký tự).

1
@rrr Bạn muốn anh ấy viết nó cho bạn cũng như đánh vần nó? Tất cả những gì bạn cần làm là thêm dấu gạch nối vào nhóm.
Neil Barnwell

10
@rrrr: Tôi tin rằng tôi đã đưa ra câu trả lời. Câu hỏi là “làm thế nào để viết 'X'…” và tôi tin rằng tôi đã giải thích cách làm điều đó. Nhận câu trả lời của tôi và áp dụng lời giải thích vào biểu thức thực tế trong tầm tay không cần phải có nhiều kỹ năng nhận thức hơn yêu cầu của một học sinh lớp một. Trên thực tế, đây chính xác là những gì học sinh lớp 1 phải làm khi được dạy số học cơ bản. Hãy sửa lại giả định của tôi.
Konrad Rudolph


2
@MarkP Vâng, duh: mã hex ký tự được chuyển đổi bởi trình phân tích cú pháp front-end (của C # hoặc JavaScript, hoặc bất kỳ ngôn ngữ nào bạn đang sử dụng) thành ký tự thực. Vì vậy, sử dụng mã hex cũng giống như sử dụng các ký tự thực tế liên quan đến giá trị của chuỗi.
Konrad Rudolph

1
@Pshemo Tất nhiên, một sai lầm ngu ngốc. Về cách giải thích trong [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ó.
Konrad Rudolph

12

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.


Tôi có xu hướng đồng ý với câu trả lời này, bạn càng ít cần biết mã càng an toàn. Điều này nhắc nhở tôi về các ưu tiên của toán tử vấn đề: stackoverflow.com/questions/10007140/… , tôi cho rằng có dấu ngoặc trong chúng (do IDE của tôi tự động thêm vào), không cần biết tất cả. Bạn hoặc người khác có thể sớm muộn gì cũng rối tung lên. Tất nhiên nếu bạn làm việc nhiều với regex trong các dự án của mình, bạn có thể yêu cầu phải có kiến ​​thức nâng cao hơn.
Christophe Roussy

4

[-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.


Nên là một trong những câu trả lời tốt nhất.
Razor's Edge

3

Đây có phải là những gì bạn đang theo đuổi?

MatchCollection matches = Regex.Matches(mystring, "-");

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.