Thoát khỏi dấu gạch chéo về phía trước trong biểu thức chính quy


106

Câu hỏi của tôi là một câu hỏi đơn giản, và đó là về thoát biểu thức chính quy. Bạn có phải thoát khỏi dấu gạch chéo /trong biểu thức chính quy không? Và bạn sẽ làm như thế nào?


1
Bạn sử dụng triển khai ngôn ngữ / biểu thức chính quy nào?
Gumbo

Thật thú vị, tôi đang tìm câu hỏi này cho Javascript. Nhưng sau đó IDE của tôi nói rằng tôi đang sử dụng một lối thoát không cần thiết. Vì vậy, myStr.replace(/[/:.-]+/gi, '_')là hợp lệ để tôi ngạc nhiên. Tôi nghĩ rằng tôi sẽ cần /[\/:.-]+/gi. Tôi không thể quyết định điều này là thú vị hay khó hiểu.
Turbo

Câu trả lời:


90

Ngữ cảnh / ngôn ngữ nào? Một số ngôn ngữ sử dụng /làm dấu phân cách mẫu, vì vậy có, bạn cần phải thoát khỏi nó, tùy thuộc vào ngôn ngữ / ngữ cảnh nào. Bạn thoát khỏi nó bằng cách đặt dấu gạch chéo ngược phía trước nó: \/Đối với một số ngôn ngữ (như PHP), bạn có thể sử dụng các ký tự khác làm dấu phân cách và do đó bạn không cần phải thoát nó. Nhưng AFAIK trong tất cả các ngôn ngữ, ý nghĩa đặc biệt duy nhất /có là nó có thể là dấu phân cách mẫu được chỉ định.


38

Dưới đây là một số tùy chọn:

  • Trong Perl, bạn có thể chọn các dấu phân cách thay thế. Bạn không bị giới hạn m//. Bạn có thể chọn cái khác, chẳng hạn như m{}. Sau đó, thoát không cần thiết. Trên thực tế, Damian Conway trong "Các phương pháp hay nhất của Perl" khẳng định rằng đó m{}là dấu phân cách thay thế duy nhất nên được sử dụng và điều này được củng cố bởi Perl :: Critic (trên CPAN). Mặc dù bạn có thể thoát khỏi việc sử dụng nhiều ký tự phân tách thay thế //{}có vẻ là ký tự rõ ràng nhất để giải mã sau này. Tuy nhiên, nếu một trong hai lựa chọn đó dẫn đến việc bỏ trốn quá nhiều, hãy chọn bất kỳ lựa chọn nào cho vay tốt nhất để có thể cho vay. Ví dụ phổ biến là m(...), m[...], và m!...!.

  • Trong trường hợp bạn không thể hoặc không muốn sử dụng các dấu phân cách thay thế, bạn có thể thoát khỏi dấu gạch chéo về phía trước bằng dấu gạch chéo ngược: m/\/[^/]+$/ví dụ: (sử dụng dấu phân cách thay thế có thể trở thành m{/[^/]+$}, có thể đọc rõ ràng hơn). Thoát khỏi dấu gạch chéo với một dấu gạch chéo ngược là điều đủ phổ biến để có được một cái tên và một trang wikipedia: Hội chứng Nghiêng Tăm . Trong biểu thức chính quy chỉ có một trường hợp duy nhất, việc thoát khỏi một dấu gạch chéo có thể không tăng đến mức được coi là cản trở đối với tính dễ đọc, nhưng nếu nó bắt đầu vượt quá tầm kiểm soát và nếu ngôn ngữ của bạn cho phép các dấu phân cách thay thế như Perl, điều đó sẽ là giải pháp ưu tiên.


1
Bạn có thể đưa ra một ví dụ không? Tôi có điều này: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confVà tôi nhận được xung đột với các dấu gạch chéo về phía trước.
CMCDragonkai

Lưu ý rằng bạn sử dụng một s, không phải an m, khi thực hiện thay thế (hay còn gọi là thay thế) bằng biểu thức chính quy. perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... nhưng điều này có lẽ tốt hơn: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confvì nó tránh được nội suy shell.
DavidO

1
Một giải pháp thay thế để thoát /ký tự chữ là sử dụng chức năng regex để chỉ định một ký tự bằng mã hóa ASCII của nó, ở dạng hex hoặc bát phân. Perl chấp nhận các hình thức bát phân \57(nguồn regular-expressions.info/refcharacters.html )
lukeuser

Trong trang được liên kết bởi lukeuser (cảm ơn bạn) cũng có Trình tự thoát \ Q ... \ E. Điều này đã làm việc cho tôi.
user3012857

11

Sử dụng dấu gạch chéo ngược \hoặc chọn một dấu phân tách khác, nghĩa là m#.\d#thay vì /.\d/ "Trong Perl, bạn có thể thay đổi dấu phân cách / biểu thức chính quy thành hầu hết các ký tự đặc biệt khác nếu bạn đặt trước nó bằng chữ m (cho khớp);"


6

Nếu dấu phân cách là /, bạn sẽ cần phải thoát.


0

Nếu bạn đang sử dụng C #, bạn không cần phải thoát khỏi nó.


Có thể được, nhưng ở đây họ đang sử dụng perl.
Toto

0

Đối với java, bạn không cần phải làm như vậy.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Nếu bạn đặt \ trước /. IDE sẽ cho bạn biết "Thoát ký tự thừa" \ / "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.