2013-02-01 10 views
7

Herhangi biri bana ters eğik çizgi dışında herhangi bir özel karaktere izin vermemesi gereken dizeyi doğrulamak için regex sağlayabilir. Ben C# içinde ters eğik çizgiye izin vermek için düzenli ifade C#

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$"); 

çalıştı Ama Ya (bir kez C# için ve bir kez Regex motoru için) ondan kaçmak çift gerekir

+3

"Çalışmıyor gibi görünüyor" demek? Beklemediğiniz şey nedir? –

cevap

8

çalışmak görünmüyor:

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

Yoksa can C verbatim string feature # kullanmak (@ dikkat edin): kelimesi kelimesine dizesi

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 

, ters eğik çizgi değil yorumlarla Bir kaçış dizisi başlattığından beri, sadece bir kez Regex motoru için kaçmak gerekiyor.

Geçerli kodunuzun derlenmediğini varsayalım. "Tanınmayan kaçış dizisi" satırları boyunca bir şey söylemelidir.
Bunun nedeni, üç boşluk ve ardından boşluk bırakmanız. İlk iki ters eğik çizgi bir ters eğik çizgi temsil eden bir kaçış dizisi olarak yorumlanır, ancak üçüncü ters eğik çizgi, ikinci karakter olarak bir boşluk ile bir kaçış dizisi başlatılması olarak yorumlanır. Hataya yol açan böyle bir kaçış sırası mevcut değil.

0

Tek \ eşleştirme için 4\sekleyerek ifadeler için \ yanı sıra C# dize kaçmak zorunda kalacaktı.

17

Tersbölüler normal ifadelerde kaçan gerekir - ve verbatim string literals kullanmadıkça onlar da, C# kaçtı gerekir . Yani bunlardan birini çalışması gerekir:

^[a-zA-Z0-9\\ ]*$ 

Regex kod sonra çift ters eğik çizgi göreceksiniz ve de buna göre işlem:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

Bunların her ikisi de aşağıdaki dize içeriği Regex kurucusuna iletilmesini sağlamak "Ben gerçekten ters eğik çizgi karakterini eşleştirmek istiyorum." Temel olarak, her zaman "regex motoruna iletmek istediğiniz dizi içeriği" ile "kaynak kodundaki dize değişmez temsili" arasında ayrım yapmanız gerekir. (Bu tabii ki, sadece normal ifadeler için de geçerlidir ayıklayıcı İzle pencereleri vb kaçarak yardımcı olmuyor.)

DÜZENLEME: Şimdi soru başlangıçta üç ters eğik çizgi olduğunu göstermek için düzenlendiğini Bu sadece geçerli değil C#. Bunlardan herhangi biri olacağını siz "üç ters eğik çizgi ile bir dize" hedefleyen edildi şüpheli :

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$"); 

... ama normal ifadedir kadarıyla boşluk kaçmak gerekmez endişeli.

+0

Lütfen kodun derleme yapmaması nedeniyle Regex ctor'a hiçbir şeyin geçmediğini unutmayın. –

+1

@DanielHilgarth: Düzenlemeden önce derlenen soruda * gösterilen * kodu.(Ben soruya cevap verdiğimde, soru iki ters eğik çizgi gösterdi. Kod tarzında değil, ve ben işaretlemenin üç ters eğik çizgi olduğunu anladım, ama gördüğüm soruya cevap verdim :) –

+0

Sadece kodu biçimlendirdim. Lütfen orijinal revizyonun kaynağına bir göz atın. Üç ters eğik çizgi en başından beri vardı. –