Denemeden ne zaman ve ne kaçması gerektiğini bilmek, ipin içinden geçtiği bağlam zincirini tam olarak anlamak için gereklidir. Dizgiyi en uzak taraftan, regexp ayrıştırma kodu tarafından işlenen bellek olan son hedefine kadar belirlersiniz.
Bellekteki dizenin nasıl işlendiğine dikkat edin: kodun içinde düz bir dize veya komut satırına girilen bir dize olabilir, ancak bir etkileşimli komut satırı veya kabuk komut dosyası içinde belirtilen bir komut satırı olabilir veya kodda belirtilen bellekteki bir değişkenin veya daha fazla değerlendirme yoluyla (dize) bağımsız değişkeninin veya herhangi bir kapsülleme ile dinamik olarak oluşturulan kodu içeren bir dize içinde ...
Bu bağlamın her birine özel işlevselliğe sahip bazı karakterler verilmiştir.
Karakteri, özel işlevini (bağlama özgü) kullanmadan tam anlamıyla geçirmek istediğinizde, bundan sonra, bir sonraki bağlam için, bundan başka olması gereken diğer bazı kaçış karakterlerine ihtiyaç duyabilecek olan, kaçmak zorundasınız. önceki bağlam (lar) da kaçtı. Dahası, karakter kodlama gibi şeyler olabilir (en sinsi utf-8'dir, çünkü ortak karakterler için ASCII gibi görünür, ancak ayarlarına bağlı olarak terminal tarafından bile isteğe bağlı olarak yorumlanabilir, böylece farklı davranabilir, ardından HTML'nin kodlama özelliği / XML, işlemi tam olarak anlamak gerekir.
Örneğin, komut satırında başlayan bir regexp dosyası, dosya tanıtıcılarını boru olarak bağlayan perl -npe
bir dizi exec sistem çağrısına aktarılmalıdır , bu exec sistem çağrılarının her birinde yalnızca (çıkışsız) boşluklarla ayrılmış argümanların bir listesi vardır, ve muhtemelen boru (|) ve yeniden yönlendirme (> N> N> ve K), parantez, etkileşimli genişlemesi *
ve ?
,$(())
... (tüm bunlar * sh tarafından kullanılan ve bir sonraki bağlamda normal ifadenin karakterine müdahale ettiği anlaşılan özel karakterlerdir, ancak sırasıyla değerlendirilir: komut satırından önce. bash / sh / csh / tcsh / zsh olarak program, temelde çift tırnak veya tek tırnak içinde kaçış daha basittir, ancak komut satırında bir dize alıntı yapmak gerekli değildir, çünkü çoğunlukla boşluk ters eğik çizgi ile ön ekli ve tırnak işareti vardır * ve? karakterleri için genişleme işlevselliğini bırakmak gerekli değildir, ancak alıntı içinde olduğu gibi farklı bağlamda ayrıştırılır.Ardından komut satırı değerlendirildiğinde bellekte elde edilen normal ifade (komut satırında yazıldığı gibi) aynı muameleyi alır regexp için köşeli parantezler [],perl düzenli ifadesi, büyük bir alfa-sayısal olmayan karakter kümesiyle tırnak içine alınabilir (örneğin, m // veya m: / better / for / path: ...).
Diğer cevaptaki son regexp bağlamına özgü karakterler hakkında daha fazla ayrıntı var. Belirttiğim gibi, regexp kaçışını denemelerle bulduğunuzdan bahsettiğiniz gibi, bunun nedeni muhtemelen farklı bağlamın girişimlerinizi karıştıran farklı bir karakter kümesine sahip olmasıdır (genellikle ters eğik çizgi, işlevi yerine değişmez bir karakterden kaçmak için bu farklı bağlamda kullanılan karakterdir ).
escape()
dizelerin regex parçaları olarak kullanılmasına izin vermek için " " gibi işlevlere sahiptir .