Щоб знати, коли і з чого врятуватися без спроб, необхідно точно зрозуміти ланцюжок контекстів, через які проходить струна. Ви вкажете рядок від найдальшої сторони до його кінцевого пункту призначення, що є пам'яттю, оброблюваною кодом розбору regexp.
Будьте в курсі, як обробляється рядок у пам'яті: якщо може бути звичайна рядок всередині коду або рядок, що вводиться в командний рядок, але a може бути або інтерактивним командним рядком, або командним рядком, зазначеним всередині файлу сценарію оболонки, або всередині змінної в пам'яті, згаданої кодом, або (рядкового) аргументу шляхом подальшої оцінки, або рядка, що містить код, що генерується динамічно з будь-яким видом інкапсуляції ...
Кожному з цього контексту призначені деякі символи з особливою функціональністю.
Коли ви хочете передати персонаж буквально, не використовуючи його спеціальної функції (локальної для контексту), тоді вам слід уникнути цього, для наступного контексту ... який може потребувати інших символів втечі, які, можливо, додатково повинні бути вийшли з попереднього контексту. Крім того, можуть бути такі речі, як кодування символів (найбільш підступним є utf-8, тому що він схожий на ASCII для загальних символів, але може бути необов'язково інтерпретований навіть терміналом залежно від його налаштувань, щоб він міг поводитися по-різному, то атрибут кодування HTML / XML, потрібно правильно зрозуміти процес.
Наприклад, регулярний вираз в командному рядку, починаючи з perl -npe
, потрібно перенести до набору системних викликів exec, що з'єднує в якості труби файл файлів, кожен із цих викликів системи exec просто містить список аргументів, які були розділені між (пропущеними) пробілами, і, можливо, труби (|) та перенаправлення (> N> N> & M), дужки, інтерактивне розширення *
та ?
,$(())
... (все це - спеціальні символи, які використовуються * sh, які можуть здатися перешкоджати символу регулярного виразу в наступному контексті, але вони оцінюються в порядку: перед командним рядком. Командний рядок читається програма як bash / sh / csh / tcsh / zsh, по суті всередині подвійної або однієї цитати, втеча простіша, але не потрібно цитувати рядок у командному рядку, оскільки в основному простір має бути попередньо встановлений зворотною косою рисою, і цитата є не потрібно залишати доступним функціонал розширення для символів * і?, але цей синтаксичний розбір настільки ж інший контекст, як у цитаті. Потім, коли оцінюється командний рядок, отриманий в пам'яті регулярний вираз (не такий, як написано в командному рядку) отримує те саме обробку, що і його буде у вихідному файлі. Для regexp є контекст набору символів у квадратних дужках [],регулярний вираз perl може бути процитований великим набором символів, що не містять літер (наприклад, m // або m: / краще / для / шлях: ...).
У вас є більше деталей про символи в іншій відповіді, які дуже специфічні для остаточного контексту регулярного виразка. Як я зазначив, ви згадуєте, що ви знаходите втечу з регулярних викидів із спробами, ймовірно, тому, що різний контекст має різний набір символів, який плутає вашу пам’ять про спроби (часто зворотний косий знак - це символ, який використовується в тому іншому контексті, щоб уникнути буквального символу замість його функції ).
escape()
" дозволяти використовувати довільні рядки як частини регулярних виразів.