Normal ifadede eğik çizgiden kaçış


106

Sorum basit ve kaçan düzenli ifade ile ilgili. /Normal ifadede eğik çizgiden kaçmak zorunda mısınız? Ve bunu nasıl yapacaksın?


1
Hangi dili / normal ifade uygulamasını kullanıyorsunuz?
Gumbo

Yeterince ilginç bir şekilde, Javascript için bu soruyu arıyordum. Ama sonra IDE'm gereksiz bir kaçış kullandığımı söyledi. Yani myStr.replace(/[/:.-]+/gi, '_')benim için sürpriz geçerlidir. İhtiyacım olacağını düşündüm /[\/:.-]+/gi. Bunun havalı mı yoksa kafa karıştırıcı mı olduğuna karar veremiyorum.
Turbo

Yanıtlar:


90

Hangi bağlam / dil? Bazı diller /desen sınırlayıcı olarak kullanılır, bu nedenle evet, hangi dil / bağlama bağlı olarak ondan kaçmanız gerekir. Önüne ters eğik çizgi koyarak kaçabilirsiniz: \/Bazı diller için (PHP gibi) sınırlayıcı olarak diğer karakterleri kullanabilirsiniz ve bu nedenle ondan kaçmanız gerekmez. Ancak tüm dillerde AFAIK'in /sahip olduğu tek özel önemi , belirlenmiş desen sınırlayıcı olabileceğidir.


38

İşte birkaç seçenek:

  • Perl'de alternatif sınırlayıcılar seçebilirsiniz. Sınırlı değilsin m//. Gibi başka birini seçebilirsiniz m{}. O zaman kaçmak gerekli değildir. Nitekim, "Perl Best Practices" daki Damian Conway, m{}kullanılması gereken tek alternatif sınırlayıcı olduğunu iddia ediyor ve bu Perl :: Critic (CPAN'da) tarafından pekiştiriliyor. Çeşitli alternatif sınırlayıcı karakterleri kullanmaktan kurtulabilirsiniz //ve {}daha sonra deşifre edilmesi en net olanı gibi görünmektedir. Bununla birlikte, bu seçeneklerden herhangi biri çok fazla kaçışla sonuçlanırsa, hangisinin okunaklılığa en uygun olduğunu seçin. Yaygın örnekler m(...), m[...]ve m!...!.

  • Alternatif sınırlayıcıları kullanamadığınız veya kullanmamayı tercih ettiğiniz durumlarda, eğik çizgiden bir ters eğik çizgiyle kaçabilirsiniz: m/\/[^/]+$/örneğin ( m{/[^/]+$}daha net okunabilecek alternatif bir sınırlayıcı kullanarak ). Eğik çizgiden ters eğik çizgiyle kaçmak, bir ad ve bir wikipedia sayfası kazanacak kadar yaygındır: Eğik Kürdan Sendromu . Yalnızca tek bir örneğin olduğu normal ifadelerde, bölü çizgisinden kaçmak okunaklılık için bir engel olarak kabul edilme düzeyine yükselmeyebilir, ancak kontrolden çıkmaya başlarsa ve diliniz Perl'in yaptığı gibi alternatif sınırlayıcılara izin veriyorsa, bu tercih edilen çözüm olun.


1
Bir örnek verebilir misin? perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confŞuna sahibim : Ve eğik çizgilerle çatışmalar alıyorum.
CMCDragonkai

Normal ifadelerle bir değiştirme (diğer bir deyişle ikame) yaparken san değil, kullandığınızı unutmayın m. perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... ama bu muhtemelen daha iyi: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confçünkü kabuk enterpolasyonunu önler.
Davido

1
Değişmez /karakterden çıkış yapmanın bir alternatifi, bir karakteri ASCII kodlamasıyla onaltılık veya sekizlik olarak belirtmek için normal ifade işlevini kullanmaktır. Perl sekizlik formu kabul \57(kaynak regular-expressions.info/refcharacters.html )
lukeuser

Lukeuser tarafından bağlantı verilen sayfada (teşekkür ederim) ayrıca Kaçış Dizisi \ Q ... \ E var. Bu benim için çalıştı.
user3012857

11

Ters eğik çizgi kullanın \veya farklı bir ayırıcı seçebilirsiniz, yani m#.\d#yerine /.\d/ "sen (maç için) mektup m ile preceed eğer In Perl, hemen hemen tüm diğer özel karakterine / düzenli ifade sınırlayıcı değiştirebilir;"


6

Sınırlayıcı / ise, kaçmanız gerekecek.


0

C # kullanıyorsanız, ondan kaçmanıza gerek yoktur.


Olabilir, ama burada perl kullanıyorlar.
Toto

0

Java için buna gerek yok.

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

/ Karakterinin önüne \ koyarsanız. IDE size ReGex'te "Gereksiz Karakter Kaçışını" \ / "söyleyecektir"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.