2011-04-17 25 views
5

Verilen bir dizeyi içeren tüm kelimelerin hepsini eşleştirmem gerekiyor.C# - Regex Tüm kelimeleri göster

string s = "ABC.MYTESTING 
XYZ.YOUTESTED 
ANY.TESTING"; 

Regex r = new Regex("(?<TM>[!\..]*TEST.*)", ...); 
MatchCollection mc = r.Matches(s); 

Olmak sonucu gerekir:

MYTESTING 
YOUTESTED 
TESTING 

Ama olsun:

TESTING 
TESTED 
.TESTING 

Ben Düzenli ifadelerle bunu başarmak nasıl.

Düzenleme: Genişletilmiş örnek dizesi.

cevap

3

("" @) w kelimeyi içeren \

BTW, normal ifade modeli, sen

@"(?<TM>\w*TEST\w*)" 

kullanmalıdır bir kelimesi kelimesine dize olmalıdır karakterleri ve [A-Za-z0-9_]

+0

Aslında her yerde TEST ile eşleşme arıyorum .. – tvr

+0

Önerinizi güncelledim. –

+0

Bu işe yaradı ama \ w – tvr

1

\b'u kullanmayı deneyin. Kelime olmayan bir sınırlayıcı için normal ifade bayrağı.

/\b[a-z]+\b/i 

BTW, .net çevreleyen / ihtiyacı yoktur ve i sadece küçük harf duyarsız maç bayrağıdır: Her iki kelimeyi eşleştirmek istedik Eğer kullanabilirsiniz.

NET Alternatif:

var re = new Regex(@"\b[a-z]+\b", RegexOptions.IgnoreCase); 
+0

Bu, her iki kelimede de değil, 1 harfli bir sözcükle eşleşir. – mousio

+0

Hmm. Bunu nasıl belirleyebilirim? Bunu denedim ama çalışmıyor: Regex r = new Regex ("\ b (? [! \ ..] * TEST. *) \ B", ...); – tvr

+0

@mousino: Nitekim bir niceleyiciyi özledim, ancak her iki kelimeyi de eşleştireceğim. –

0

kullanma Gruplar Ben bunu elde edebilirsiniz düşünüyorum.

 string s = @"ABC.TESTING 
     XYZ.TESTED"; 
     Regex r = new Regex(@"(?<TM>[!\..]*(?<test>TEST.*))", RegexOptions.Multiline); 
     var mc= r.Matches(s); 
     foreach (Match match in mc) 
     { 
      Console.WriteLine(match.Groups["test"]); 
     } 

Tam olarak istediğiniz gibi çalışır. Eğer 'TEST' dahil tüm kelimelerin aradığını Eğer

+0

Bu işe yaramıyor .. – tvr

+0

Cevabımı düzenledim. – manojlds

+0

'Multilin 'seçeneğine burada gerek yoktur, ancak' IgnoreCase' olabilir. Ve [! \ ..] * 'hakkında, cevabımı gör. –

2

için kısadır. Bunu basitçe yapın: neden eşleşme modeli olarak \w*TEST\w*'u denemeyin. @manojlds söylediği gibi mümkün olan her durumda, sen regexes için harfi harfine dizeleri kullanmalıdır,

string s = @"ABC.MYTESTING 
XYZ.YOUTESTED 
ANY.TESTING"; 

var m = Regex.Matches(s, @"(\w*TEST\w*)", RegexOptions.IgnoreCase); 
2

Ben aşağıdaki ile bekliyoruz sonuçlar elde ederler. Aksi takdirde, yalnızca bir tane değil (örneğin [!\\..]*), normal sekme kaçış dizilerinizin çoğunda iki ters eğik çizgi kullanmanız gerekir.

İkincisi, bir noktadan başka bir noktayla eşleştirmek istiyorsanız, normal ifadenin bu bölümü [^.]* olmalıdır. ^, ! değil karakter sınıfını dönüştüren ve bu bağlamda . özel bir anlam taşımayan metakarakter karakteristir, bu nedenle kaçması gerekmez. Ancak, "kelime" ile tam olarak ne demek istediğine bağlı olarak, \w* veya [A-Z]* kullanın. [!\..], ! veya . ile eşleşir.

Regex r = new Regex(@"(?<TM>[A-Z]*TEST[A-Z]*)", RegexOptions.IgnoreCase); 

onlar incitme olsa, sözcük sınırları ile rahatsız etmek gerek kalmayacak şekilde: Her zaman zaten bütün maçı alıyorsun

Regex r = new Regex(@"(?<TM>\b[A-Z]*TEST[A-Z]*\b)", RegexOptions.IgnoreCase); 

Son olarak, sana don'

Regex r = new Regex(@"\b[A-Z]*TEST[A-Z]*\b", RegexOptions.IgnoreCase); 

eşleşti metin Match'in Value özellik aracılığıyla satışa sunulacak: t bir yakalama grubunu kullanmak gerekir.

+0

+1, verbatim dizeleri ve bir (muhtemelen) doğru regex için, ancak 'RegexOptions.Multiline' burada hiçbir amaca hizmet etmemektedir. –

+0

@alan Sağ şimdi ve şimdi kaldırıldı. Bu benim LINQPad komutumdan içeri girdi. – arcain

+0

Evet, RegexBuddy de her zaman içeri girer. Çok sinir bozucu. –

0
Regex r = new Regex(@"(?<TM>[^.]*TEST.*)", RegexOptions.IgnoreCase); 

İlk: