Untuk mengetahui kapan dan apa yang harus dihindari tanpa upaya diperlukan untuk memahami dengan tepat rantai konteks yang dilalui oleh string. Anda akan menentukan string dari sisi terjauh ke tujuan akhirnya yang merupakan memori yang ditangani oleh kode parsing regexp.
Waspadai bagaimana string dalam memori diproses: jika bisa berupa string polos di dalam kode, atau string yang dimasukkan ke baris perintah, tetapi bisa berupa baris perintah interaktif atau baris perintah yang dinyatakan di dalam file skrip shell, atau di dalam variabel dalam memori yang disebutkan oleh kode, atau argumen (string) melalui evaluasi lebih lanjut, atau string yang berisi kode yang dihasilkan secara dinamis dengan segala jenis enkapsulasi ...
Masing-masing konteks ini menetapkan beberapa karakter dengan fungsi khusus.
Ketika Anda ingin melewatkan karakter secara harfiah tanpa menggunakan fungsi khusus (lokal ke konteks), maka Anda harus menghindarinya, untuk konteks berikutnya ... yang mungkin memerlukan beberapa karakter pelarian lain yang mungkin juga perlu melarikan diri dalam konteks sebelumnya. Selain itu, ada hal-hal seperti pengkodean karakter (yang paling berbahaya adalah utf-8 karena terlihat seperti ASCII untuk karakter umum, tetapi dapat ditafsirkan secara opsional bahkan oleh terminal tergantung pada pengaturannya sehingga mungkin berperilaku berbeda, kemudian atribut pengkodean HTML / XML, perlu untuk memahami prosesnya dengan tepat.
Misalnya, regexp dalam baris perintah yang dimulai dengan perl -npe
, perlu ditransfer ke satu set panggilan sistem exec yang menghubungkan file pipa, masing-masing panggilan sistem exec ini hanya memiliki daftar argumen yang dipisahkan oleh ruang (tidak lolos), dan mungkin pipa (|) dan pengalihan (> N> N> & M), kurung, ekspansi interaktif *
dan ?
,$(())
... (semua ini adalah karakter khusus yang digunakan oleh * sh yang mungkin muncul untuk mengganggu karakter ekspresi reguler dalam konteks berikutnya, tetapi mereka dievaluasi dalam urutan: sebelum baris perintah. Baris perintah dibaca oleh memprogram sebagai bash / sh / csh / tcsh / zsh, pada dasarnya di dalam double quote atau single quote melarikan diri lebih sederhana tetapi tidak perlu untuk mengutip string di baris perintah karena sebagian besar ruang harus diawali dengan backslash dan kutipan tersebut tidak perlu meninggalkan tersedia memperluas fungsi untuk karakter * dan?, tapi ini menguraikan konteks yang berbeda seperti dalam kutipan. Kemudian ketika baris perintah dievaluasi regexp yang diperoleh dalam memori (tidak seperti yang tertulis dalam baris perintah) menerima perlakuan yang sama seperti itu akan berada dalam file sumber. Untuk regexp ada konteks karakter-set dalam tanda kurung [],perl ekspresi reguler dapat dikutip oleh sejumlah besar karakter non-alfa-numerik (Misalnya m // atau m: / better / for / path: ...).
Anda memiliki detail lebih lanjut tentang karakter dalam jawaban lain, yang sangat spesifik untuk konteks regexp akhir. Seperti yang saya catat Anda menyebutkan bahwa Anda menemukan pelarian regexp dengan upaya, itu mungkin karena konteks yang berbeda memiliki serangkaian karakter yang membingungkan memori upaya Anda (sering backslash adalah karakter yang digunakan dalam konteks yang berbeda untuk melarikan diri dari karakter literal alih-alih fungsinya. ).
escape()
" untuk mengizinkan penggunaan string acak sebagai bagian regex.