Không thể thoát khỏi dấu gạch chéo ngược với regex?


114

Tôi đang sử dụng regex sau

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Tôi biết nó xấu xí, nhưng cho đến nay nó phục vụ mục đích của nó ngoài dấu gạch chéo ngược không được phép như tôi nghĩ vì nó đã thoát ra, tôi cũng đã thử \\thay vì \\\nhưng kết quả tương tự. Có ý kiến ​​gì không?


4
Tôi vừa sửa lỗi đánh máy trong tiêu đề, nhưng có điều gì đó vô cùng tuyệt vời về tiêu đề "Không thể thoát khỏi phản ứng dữ dội với regex?" Thật!
Adam Crossland

1
@AdamCrossland Không phải chúng ta đều mong regex có thể giúp chúng ta thoát khỏi phản ứng dữ dội sao? > _>
Eton B.

2
Heck, tôi chỉ ước rằng tôi có thể thoát khỏi phản ứng dữ dội TỪ regex.
Adam Crossland

Câu trả lời:


225

Nếu bạn đang đặt chuỗi này trong một chuỗi trong một chương trình, bạn có thể thực sự cần sử dụng bốn dấu gạch chéo ngược (vì trình phân tích cú pháp chuỗi sẽ xóa hai trong số chúng khi "khử thoát" nó cho chuỗi và khi đó regex cần hai dấu gạch chéo ngược cho một thoát dấu gạch chéo ngược regex).

Ví dụ:

regex("\\\\")

được hiểu là ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

được hiểu là ...

regex(\\)

được hiểu là một regex khớp với một dấu gạch chéo ngược.


Tùy thuộc vào ngôn ngữ, bạn có thể sử dụng một dạng trích dẫn khác không phân tích cú pháp chuỗi thoát để tránh phải sử dụng nhiều - ví dụ: trong Python:

re.compile(r'\\')

Phía rtrước dấu ngoặc kép làm cho nó trở thành một chuỗi thô không phân tích cú pháp dấu gạch chéo ngược thoát ra.


14
hehe ... Mình mới gặp cái này và cần thêm ba cái. Tôi chỉ tiếp tục thêm dấu gạch chéo ngược cho đến khi nó hoạt động.
billynoah

ummm, tại sao trên trái đất, regex này được diễn giải lại hai lần thay vì một lần như nó được cho là dành cho PCRE?
Jim Michaels

3
@JimMichaels bởi vì không phải tất cả các ngôn ngữ đều có các ký tự regex không thoát và do đó, đôi khi ngôn ngữ lập trình tự diễn giải dấu gạch chéo thoát ra một lần trong cú pháp chuỗi của nó và chuỗi kết quả sau đó được chuyển đến công cụ regex (công cụ diễn giải dấu gạch chéo thoát ra trong cú pháp regex).
Amber

1
cách đây rất lâu, tôi đã phải chụp một xpath của một phần tử có đặc điểm nhận dạng duy nhất là đường dẫn tệp windows, sau đó tạo một chương trình (dưới dạng chuỗi) trong đó xpath được biểu diễn dưới dạng chuỗi. tại một thời điểm trong các bước trung gian có 8 dấu gạch chéo ngược được sử dụng để biểu thị một dấu gạch chéo ngược trong đường dẫn tệp. Đó là mức cao nhất mà tôi từng đạt được.
Zackkenyon

Điều này thậm chí có thể trở nên phức tạp hơn khi tìm kiếm dấu gạch chéo ngược cùng với các mẫu yêu cầu ký tự meta. Lấy ví dụ, tìm một dấu gạch chéo ngược theo sau là một chữ số. Bây giờ bạn muốn được nhìn chằm chằm vào biểu thức sau đây cố gắng tìm ra những gì đang xảy ra: new RegExp('\\\\\\d');.
jabacchetta

15

Nếu nó không phải là một chữ, bạn phải sử dụng \\\\để bạn nhận được \\nghĩa là một dấu gạch chéo ngược thoát ra.

Đó là bởi vì có hai đại diện. Trong biểu diễn chuỗi của regex của bạn, bạn có "\\\\", Đó là những gì được gửi đến trình phân tích cú pháp. Trình phân tích cú pháp sẽ xem \\nó diễn giải là dấu gạch chéo ngược hợp lệ (khớp với một dấu gạch chéo ngược duy nhất).


10

Dấu gạch chéo ngược \là ký tự thoát cho biểu thức chính quy. Do đó, một dấu gạch chéo ngược kép thực sự sẽ có nghĩa là một dấu gạch chéo ngược đơn, theo nghĩa đen.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html


4

Từ http://www.regular-expressions.info/charclass.html :

Lưu ý rằng các ký tự đặc biệt hoặc siêu ký tự duy nhất bên trong một lớp ký tự là dấu ngoặc đóng (]), dấu gạch chéo ngược (\\), dấu mũ (^) và dấu gạch ngang (-). Các siêu ký tự thông thường là các ký tự bình thường bên trong một lớp ký tự và không cần phải thoát ra bằng dấu gạch chéo ngược. Để tìm kiếm dấu sao hoặc dấu cộng, hãy sử dụng [+ *]. Regex của bạn sẽ hoạt động tốt nếu bạn thoát khỏi các siêu ký tự thông thường bên trong một lớp ký tự, nhưng làm như vậy làm giảm đáng kể khả năng đọc.

Để bao gồm một dấu gạch chéo ngược dưới dạng một ký tự không có bất kỳ ý nghĩa đặc biệt nào bên trong một lớp ký tự, bạn phải thoát khỏi nó bằng một dấu gạch chéo ngược khác. [\\ x] khớp với dấu gạch chéo ngược hoặc x. Dấu ngoặc đóng (]), dấu mũ (^) và dấu gạch nối (-) có thể được đưa vào bằng cách thoát chúng bằng dấu gạch chéo ngược hoặc bằng cách đặt chúng ở vị trí mà chúng không mang ý nghĩa đặc biệt. Tôi khuyên bạn nên sử dụng phương pháp thứ hai, vì nó cải thiện khả năng đọc. Để bao gồm dấu mũ, hãy đặt dấu mũ ở bất kỳ đâu ngoại trừ ngay sau dấu ngoặc mở. [x ^] khớp với x hoặc dấu mũ. Bạn có thể đặt dấu ngoặc đóng ngay sau dấu ngoặc mở hoặc dấu mũ phủ định. [] x] khớp với dấu ngoặc đóng hoặc dấu x. [^] x] khớp với bất kỳ ký tự nào không phải là dấu ngoặc đóng hoặc dấu x. Dấu gạch ngang có thể được đưa vào ngay sau dấu ngoặc mở, hoặc ngay trước dấu ngoặc đóng hoặc ngay sau dấu mũ phủ định.

Bạn đang viết regex bằng ngôn ngữ nào?


0

Giải pháp này đã khắc phục sự cố của tôi khi thay thế thẻ br thành '\ n'.

alert(content.replace(/<br\/\>/g,'\n'));
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.