2012-03-06 49 views
136

thể trùng lặp:
How to match hyphens with Regular Expression?Regex - Dấu gạch ngang có nên được thoát không?

Dấu gạch ngang là một nhân vật đặc biệt trong regex, ví dụ, để chọn một phạm vi, tôi có thể làm một cái gì đó như:

[0-9A-F] 

Nhưng bên ngoài của dấu ngoặc vuông nó chỉ là một nhân vật thường xuyên phải không? Tôi đã thử nghiệm điều này trên một vài người kiểm tra regex trực tuyến và dấu gạch ngang dường như hoạt động như một ký tự bình thường bên ngoài dấu ngoặc vuông (hoặc thậm chí bên trong dấu ngoặc vuông nếu nó không ở giữa hai ký tự - ví dụ như [-g] - hoặc g) cho dù nó có được thoát hay không. Tôi không thể tìm thấy câu trả lời cho điều này, nhưng tôi tự hỏi có hay không thông thường để thoát khỏi dấu gạch nối.

Cảm ơn!

+5

Tùy thuộc vào ngôn ngữ bạn sử dụng để thể hiện các biểu thức bất thường. – zzzzBov

+3

Đây là một bài đăng tương tự nên trả lời các câu hỏi của bạn: http://stackoverflow.com/a/4068725/56829 –

+4

Tôi không thấy đây là bản sao chính xác. Câu hỏi đó là hỏi LÀM THẾ NÀO để thoát khỏi dấu gạch nối. Tôi đã biết cách trốn thoát họ và yêu cầu KHI VƯỢT QUA họ là cần thiết.Thực tế là một số câu trả lời trùng lặp là không liên quan vì bản chất của các câu hỏi là khác nhau. Vui lòng mở lại. – JSideris

Trả lời

198

Đúng trên tất cả các mặt trận. Ngoài một lớp ký tự (đó là "dấu ngoặc vuông"), dấu gạch nối không có ý nghĩa đặc biệt và trong một lớp ký tự, bạn có thể đặt dấu gạch ngang làm ký tự đầu tiên hoặc cuối cùng trong phạm vi (ví dụ: [-a-z] hoặc [0-9-]), HOẶC thoát khỏi nó (ví dụ: [a-z\-0-9]) để thêm "dấu nối" vào lớp học của bạn. Bạn có thể tìm thấy dấu gạch ngang được đặt đầu tiên hoặc cuối cùng trong một lớp nhân vật, nhưng không có nghĩa là bạn sẽ bị lynched bởi đám đông cổ tức giận dữ để lựa chọn để thoát khỏi nó thay vào đó.

(Thực ra ... kinh nghiệm của tôi là rất nhiều regex được sử dụng bởi những người không hoàn toàn lúng túng cú pháp. Trong những trường hợp này, bạn thường sẽ thấy mọi thứ đã thoát (ví dụ: [a-z\%\$\#\@\!\-\_]) đơn giản chỉ vì kỹ sư không biết những gì "đặc biệt" và những gì không ... vì vậy họ "chơi nó an toàn" và làm xáo trộn biểu hiện với vô số dấu gạch chéo ngược quá mức. Bạn sẽ làm cho mình, những người đương thời của bạn, và hậu thế của bạn một ưu tiên lớn bằng cách lấy thời gian để thực sự hiểu cú pháp regex trước khi sử dụng nó.)

Câu hỏi hay!

+3

Điểm thú vị về việc trốn thoát quá mức bởi những người không hoàn toàn hiểu và muốn "chơi nó an toàn" – Medorator

+9

+1 để giúp tôi hiểu được tâm lý của "đám đông cổ họng giận dữ": D –

+2

Câu trả lời rất hữu ích. Hóa ra rằng trong Eclipse Luna, Java Linter sẽ phàn nàn nếu bạn cố gắng thoát khỏi nó. – Keab42

5

Thông thường, bạn sẽ luôn đặt dấu nối đầu tiên trong phần đối sánh []. EG, để khớp với bất kỳ chữ số nào bao gồm dấu gạch nối (được viết theo cách dài), bạn sẽ sử dụng [-a-zA-Z0-9]

10

Ngoài các lớp ký tự, thông thường là không phải để thoát dấu gạch nối. Nếu tôi thấy một dấu gạch ngang thoát ra ngoài một lớp nhân vật, điều đó sẽ gợi ý cho tôi rằng nó được viết bởi một người không cảm thấy thoải mái với các regex.

Lớp nhân vật bên trong, tôi không nghĩ một cách thông thường là cách khác; theo kinh nghiệm của tôi, nó thường là có vẻ là đặt trước hoặc cuối, như trong [-._:] hoặc [._:-], để tránh dấu gạch chéo ngược; nhưng tôi cũng thường thấy nó đã trốn thoát thay vào đó, như trong [._\-:] và tôi sẽ không gọi số đó là un thông thường.

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