Ters eğik çizgiden normal ifadeyle kaçamıyor musunuz?


114

Aşağıdaki normal ifadeyi kullanıyorum

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Çirkin olduğunu biliyorum, ama şu ana kadar ters eğik çizgiye izin verilmemesi dışında amacına hizmet ediyor çünkü kaçtı, ben de aynı sonuçları \\yerine denedim \\\. Herhangi bir fikir?


4
Başlıktaki yazım hatasını düzelttim, ancak başlıkta derinden harika bir şey var "Regex ile tepkiden kaçamaz mısınız?" Aslında!
Adam Crossland

1
@AdamCrossland Hepimiz regex'in tepkiden kaçmamıza yardımcı olmasını dilemez miyiz? > _>
Eton B.

2
Heck, keşke regex'in tepkisinden kaçabilseydim.
Adam Crossland

Yanıtlar:


227

Eğer bir program dahilinde bir dizede bu koyarak ediyorsanız, aslında bunu "de-kaçan" ne zaman dize ayrıştırıcı ikisi kaldıracak çünkü (dört ters eğik çizgi kullanmanız gerekebilir dize ve sonra regex bir için iki ihtiyacı çıkış karakterli normal ifade ters eğik çizgi).

Örneğin:

regex("\\\\")

... olarak yorumlanır ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

... olarak yorumlanır ...

regex(\\)

tek bir ters eğik çizgiyle eşleşen bir normal ifade olarak yorumlanır.


Dile bağlı olarak, çok sayıda kullanmak zorunda kalmamak için kaçış dizilerini ayrıştırmayan farklı bir alıntı biçimi kullanabilirsiniz - örneğin Python'da:

re.compile(r'\\')

rTırnak içinde ön o yapar çiğ değil ayrıştırma ters eğik çizgi kaçar yapar dize.


14
hehe ... Bununla karşılaştım ve üç tane eklemem gerekiyor. Çalışana kadar ters eğik çizgi eklemeye devam ettim.
billynoah

ummm, neden bu normal ifade PCRE için olması gerektiği gibi bir kez yerine iki kez yeniden yorumlanıyor?
Jim Michaels

3
@JimMichaels, çünkü tüm dillerde çıkış karaktersiz normal ifade bulunmaz ve bu nedenle bazen programlama dilinin kendisi eğik çizgi sözdiziminde bir kez eğik çizgi kaçışını yorumlar ve daha sonra ortaya çıkan dize (normal ifade sözdiziminde eğik çizgi kaçışlarını yorumlar) normal ifade motoruna geçirilir.
Amber

1
bir zamanlar, uzun zaman önce, tek belirleyici özelliği bir Windows dosya yolu olan bir elemanın xpath'ini yakalamak ve ardından xpath'lerin dizeler olarak temsil edileceği bir program (bir dize olarak) oluşturmak zorunda kaldım. ara adımların bir noktasında, dosya yolunda tek bir ters eğik çizgiyi temsil etmek için kullanılan 8 ters eğik çizgi vardı. Bu şimdiye kadar aldığım en yüksek şey.
Zackkenyon

Meta karakterler gerektiren modellerin yanı sıra ters eğik çizgi ararken bu daha da karmaşık hale gelebilir. Örneğin, bir ters eğik çizgi ve ardından bir rakam bulma. Şimdi neler olduğunu anlamaya çalışırken aşağıdaki ifade bakıyordu olurdu: new RegExp('\\\\\\d');.
jabacchetta

15

Birebir değilse, kaçmış bir ters eğik çizgi anlamına gelen \\\\elde etmek için kullanmanız gerekir \\.

Bunun nedeni iki temsilin olmasıdır. Normal ifadenizin dize gösteriminde "\\\\", Ayrıştırıcıya gönderilen şey var. Ayrıştırıcı, \\hangisini geçerli bir çıkış karakterli ters eğik çizgi (tek bir ters eğik çizgiyle eşleşen) olarak yorumladığını görecektir .


10

Ters eğik çizgi \, normal ifadeler için çıkış karakteridir. Bu nedenle, bir çift ters eğik çizgi gerçekten de tek bir düz ters eğik çizgi anlamına gelir.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html


4

Gönderen http://www.regular-expressions.info/charclass.html :

Bir karakter sınıfı içindeki özel karakterlerin veya metakarakterlerin yalnızca kapanış parantezi (]), ters eğik çizgi (\\), düzeltme işareti (^) ve kısa çizgi (-) olduğunu unutmayın. Olağan meta karakterler, bir karakter sınıfı içindeki normal karakterlerdir ve ters eğik çizgi ile atlanmaları gerekmez. Bir yıldız veya artı aramak için [+ *] kullanın. Bir karakter sınıfı içindeki normal meta karakterlerden kaçarsanız normal ifadeniz iyi çalışır, ancak bunu yapmak okunabilirliği önemli ölçüde azaltır.

Bir karakter sınıfına herhangi bir özel anlamı olmayan bir karakter olarak ters eğik çizgi eklemek için başka bir ters eğik çizgiyle ondan kaçınmanız gerekir. [\\ x], bir ters eğik çizgiyle veya bir x ile eşleşir. Kapatma parantezi (]), düzeltme işareti (^) ve kısa çizgi (-), bir ters eğik çizgiyle onlardan kaçarak veya özel anlamlarını almadıkları bir konuma yerleştirilerek dahil edilebilir. Okunabilirliği artırdığı için ikinci yöntemi tavsiye ederim. İmleci eklemek için, açılış parantezinin hemen sonrası dışında herhangi bir yere yerleştirin. [x ^], bir x veya bir düzeltme işaretiyle eşleşir. Kapatma ayracını açılış ayracının veya olumsuzlama imlecinin hemen sonrasına koyabilirsiniz. [] x], bir kapanış ayracı veya bir x ile eşleşir. [^] x], kapanış parantezi veya x olmayan herhangi bir karakterle eşleşir. Kısa çizgi, açılı ayraçtan hemen sonra veya kapanış ayracından hemen önce veya olumsuzlama imlecinden hemen sonra eklenebilir.

Normal ifadeyi hangi dilde yazıyorsunuz?


0

Bu çözüm, br etiketini '\ n' olarak değiştirirken sorunumu çözdü.

alert(content.replace(/<br\/\>/g,'\n'));
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.