2011-11-23 28 views
5

System.Text.RegularExpressions.Regex.Escape() thoát chỉ mở niềng răng. Có một phương pháp NET Framework mà thoát niềng răng đóng để sử dụng trong regex? Tôi không thể tìm thấy bất kỳ thứ gì. Tôi ghét phải hardcode các ký tự.Thoát Niềng đóng Dấu

chỉnh sửa: Tôi cần tạo thẻ "(? < -open>)" để cân bằng các định nghĩa nhóm. Tôi nhận được một danh sách các ký tự đại diện cho dấu phân cách đóng, thoát chúng và sau đó thêm chúng vào biểu thức trong các thẻ "(? < -open>)". Vì vậy, có, tôi thực sự phải thoát khỏi niềng răng đóng cửa là tốt.

+2

MSDN nói rằng "nếu dấu ngoặc đóng hoặc dấu ngoặc đơn không được đặt trước bởi ký tự mở tương ứng, thì công cụ biểu thức chính quy sẽ diễn giải nó theo nghĩa đen". Bạn có chắc chắn sau đó bạn cần phải thoát khỏi niềng răng đóng nó không? –

+0

@TimBourguignon: Tôi nghĩ bạn cũng có thể đặt câu trả lời ở đây. –

Trả lời

1

Regex.Escape không thoát khi tôi thử. Có điều gì khác đang xảy ra trong mã của bạn không? Đăng một ví dụ tái sản xuất của cả hai mã thoát của bạn và regex sẽ rất hữu ích. Tôi nghĩ bình luận của Tim có lẽ là dấu ấn về những gì đang diễn ra.

FWIW, thử nghiệm Regex.Escape() cung cấp cho các kết quả này:

Regex.Escape("(Hello)"); // \(Hello\) 
Regex.Escape("Hello)"); // Hello\) 
Regex.Escape("(Hello"); // \(Hello 

Edit: OK từ các ý kiến ​​Tôi hiểu bạn có nghĩa là {bây giờ, và thử nghiệm với điều đó cung cấp cho các kết quả mà bạn đang nói. Regex.Escape() đang cố gắng hữu ích bằng cách chỉ thoát khi cần, nhưng nếu đó không phải là những gì bạn muốn ở đây thì không có phương thức tích hợp nào khác hoạt động. Tôi nghĩ rằng bạn sẽ phải 1) thêm thoát nó thiếu trong chính mình, hoặc 2) nếu có thể, định dạng chuỗi đầu vào của bạn khác nhau để Regex.Escape sẽ làm việc như mong đợi.

+0

Điều thú vị. Khi tôi thử cùng một thứ, kết quả thứ hai là "Xin chào". Hm. Kỳ dị. – dijxtra

+0

Đó là dấu ngoặc đơn (dấu ngoặc tròn a.k.a.); thử nó với dấu ngoặc vuông hoặc dấu ngoặc nhọn (những gì mọi người thường có nghĩa là "niềng răng" trong kinh nghiệm của tôi), và bạn sẽ thấy nó chỉ thoát khỏi dấu ngoặc mở. –

+0

Ồ, hãy kiểm tra kỹ, tôi đã sử dụng dấu ngoặc vuông trong ví dụ của mình. – dijxtra

4

Như đã nói trong những nhận xét trên, hành vi của các chức năng thoát là như sau (MSDN):

thoát một tập tối thiểu các ký tự (\, *, +,, |, {, [? , (,), ^, $,., # và không gian màu trắng) bằng cách thay thế chúng bằng mã thoát của chúng. Điều này hướng dẫn công cụ biểu thức chính quy diễn giải các ký tự này theo nghĩa đen chứ không phải là siêu ký tự.

Các nhận xét sau được thêm vào:

Trong khi phương pháp thoát thoát khung thẳng mở ([) và mở dấu ngoặc ({) ký tự, nó không thoát khỏi nhân vật đóng tương ứng của họ (] và}). Trong hầu hết các trường hợp, việc thoát khỏi những điều này là không cần thiết. Nếu khung đóng hoặc dấu ngoặc nhọn không được đặt trước bởi ký tự mở tương ứng, thì công cụ biểu thức chính quy sẽ diễn giải theo nghĩa đen là. Nếu một bẻ khóa mở hoặc cú đúp được hiểu là một metacharacter, thì công cụ biểu thức chính quy diễn giải ký tự đóng tương ứng đầu tiên như một metacharacter. Nếu đây không phải là hành vi mong muốn, dấu ngoặc đóng hoặc dấu ngoặc phải được thoát bằng cách thêm ký tự dấu gạch chéo ngược() một cách rõ ràng. Để xem minh họa, xem phần Ví dụ.

Vì vậy, nếu các thông dịch viên tìm thấy một } mà không được đi trước bởi một khe hở { nó Automagically sẽ thoát khỏi nó.

+0

Tôi biết điều đó. Nhưng, đó không phải là những gì tôi hỏi :-) Dù sao, cảm ơn cho bạn câu trả lời, đây là một upvote cho các nỗ lực. – dijxtra

+0

Cảm ơn bạn đã upvote. Điều tốt nhất tôi tìm thấy sẽ là mở rộng lớp Regex với chức năng EscapeExtended() của riêng bạn chăm sóc các ký tự phụ đó; nhưng đó là khá nhiều phần cứng mà bạn không muốn làm. –

+0

Vâng, tôi đã viết một phương thức tĩnh riêng để làm điều đó, không cần phải thêm nó vào lớp Regex. Vì vậy, bây giờ tôi đang tìm kiếm một giải pháp thanh lịch hơn ... – dijxtra

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