2009-11-22 31 views
16

Çok satırlı modda normal ifadeleri kullanarak metni nasıl eşleştirebilir ve değiştirebilirim?Çok satırlı düzenli ifade C#

RegexOptions.Multiline seçeneğini biliyorum, ancak C# içindeki yeni satır karakterleriyle tüm eşleşmeleri belirtmenin en iyi yolu nedir?

Girdi:

<tag name="abc">this 
is 
a 
text</tag> 

Çıktı:

[tag name="abc"]this 
is 
a 
test 
[/tag] 

Aahh, ben gerçek sorunu buldum. '&' ve ';' Regex'te metinler tek bir satırda eşleştirilirken, Regex'de aynı satırın yeni satırların olduğu durumlarda da çalışması gerekir.

+0

Huh: C# '

[$1 name="$2"]$3[/$1] 

, şöyle? & and ;, normal ifadede özel karakterler değildir. Bir örnek verebilir misin? –

+0

Benzer bir şey, ancak aşağıdaki eski denemedim. rx.Replace ("name [=] " abc "", "abc", "çok satırlı metin"); –

cevap

43

ifadesinin eşleşecek yeni bir satır karakteri olması gerektiği anlamına gelirse, \n sizin için bunu yapacaktır. Aksi takdirde, çok satırlı/sözdizimi bayraklarını yanlış anlamış olabilirsiniz. İfadenizin birkaç satırda eşleşmesini istiyorsanız, aslında RegexOptions.Singleline'u kullanmak istiyorsunuz. Bunun anlamı, tüm giriş dizesini tek bir satır olarak ele almasıdır, böylece yeni satırları görmezden gelir. Bittiğin şey bu mu ...?

Örnek

Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline); 
String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]"); 
+0

Yeni satır karakterleri içerebilecek bazı metinlerle eşleştirmek istiyorum ancak zorunlu değil. Şimdi, RegexOptions.Singleline ile söylerseniz, bana bunun nasıl yapılacağına dair bir örnek gösterebilir misiniz? –

+0

Bir örnek için düzenlememe bakın. Ben varsayılan olarak, ben test ediliyor zaman ben ... elle örnekleme gibi singleline belirterek, örnek çalışma yapar, –

+0

teşekkürler, sorun farklı görünüyor, ama benim şüphelerimi temizlemek için teşekkürler çok hatlı mod hakkında. –

12

İşte eşleştirmek için bir normal ifade var. . eşleşmesini yeni satırlarla yapan RegexOptions.Singleline seçeneğini gerektirir. Bu regex sonra

<(\w+) name="([^"]*)">(.*?)</\1> 

, ilk grup etiketi, ikinci etiket adı ve etiketleri arasında üçüncü içeriğe sahip. Yani yedek dizesi aşağıdaki gibi görünebilir:

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline); 
+1

+1: Çok iyi kod ve açıklama. @Priyank Bolia: Sadece bunun yalnızca s iç içe geçemediği durumlarda çalıştığını unutmayın. Onlar * olabilir *, o zaman normal ifadeler sizi başarısız olur. –

+0

Mükemmel örnek için teşekkürler, ben anladım, ancak başka bir sorun oldu. –