2009-03-10 17 views
19

Daha büyük bir dizede yer alan "Kullanıcı Adı: firstname.surname" dizesini aldığımda, yalnızca firstname.surname bölümünü almak için normal bir ifadeyi nasıl kullanabilirim?Normal İfade'den eşleşmenin yalnızca bir parçasını döndürüyor

Denediğim her yöntem "Kullanıcı Adı: firstname.surname" dizesini döndürür. Sonra "Kullanıcı Adı:" dizesinde boş bir dizgeye geçmek için bir dizge yapmak zorundayım.

Referanslar burada kullanılabilir mi?

Düzenleme:

uzun dize "Hesap Adı: firstname.surname" içerebilir: lutfen sadece bu değeri elde etmek dizesinin bölümünü ben "Kullanıcı Adı" eşleştirmek istediğiniz dolayısıyla neden. dan mesela (bir anahtar olarak something kullanarak maçından iyi şekilde yararlanmanızı sağlayacak parantez içinde bir grup (örneğin (?<something>...)) başında ?<something> koyarak

Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)"); 
if(m.Success) 
{ 
    string name = m.Groups["name"].Value; 
} 

:

cevap

31

Ben adlı gruplar kullanmak ister Eğer grupları adlandırma sorun gitmek istemiyordu Eğer m.Groups["something"].Value)

, diyebilirsiniz

Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)"); 
if(m.Success) 
{ 
    string name = m.Groups[1].Value; 
} 

ve sadece eşleşen ilk şey olsun.

+1

sayesinde bir sürü operasyonları bu tür kullandığınız dil eğer vardır. –

2

ben kullandım tüm düzenli ifade kütüphaneleri sonra parantez kullanarak normal ifadede gruplarını tanımlamak için izin verir ve grup o erişmek; (maçları tüm ifade indeksi 0 ndaki birinci parantez grubu dizini 1 de olduğunu unutmayın) sonuçtan.

Yani, regexp'in gibi görünebilir: Kullanıcı adı: grup 1.

(. [. ^] [. ^])

tam maç parantez içinde maçları bölüm grubu 0. olduğu

2

parantez ile bir grup olun, ardından bu gibi Match.Groups koleksiyonundan almak:

string s = "User Name:firstname.surname"; 
Regex re = new Regex(@"User Name:(.*\..*)"); 
Match match = re.Match(s); 
if (match.Success) 
{ 
    MessageBox.Show(match.Groups[1].Value); 
} 

(not: birinci grup, endeks 0 ile tüm maç olduğunu)

6

cou Ayrıca "lookaround" kavramını da denerim. Bu bir çeşit sıfır genişlikli bir iddiadır, yani karakterlerle eşleşecektir, ancak sonuçta onları yakalamayacaktır.

Sizin durumunuzda, olumlu bir bakış açısı alabiliriz: "firstname.surname" hedef dizgisinin ardında yatan şeyin "Kullanıcı Adı:" olarak eşit olmasını istiyoruz. (? < = StringBehind) StringWeWant

Bu (string yerine kullanarak, biraz Java örneğin) örneğin böyle sağlanabilir:

String test = "Account Name: firstname.surname; User Name:firstname.surname"; 
String regex = "(?<=User Name:)firstname.surname"; 
String replacement = "James.Bond"; 
System.out.println(test.replaceAll(regex, replacement)); 

Bu yalnızca değiştirir

Pozitif olan ileriye dönük operatörü

"Kullanıcı Adı:" yerine "Kullanıcı Adı:" ile değiştirilen "firstname.surname" dizeleri - regex tarafından döndürülen değil, yalnızca eşleştirilir.

ÇIKIŞ: Hesap Adı: firstname.surname; Kullanıcı Adı: James.Bond

Eğer destekleri büyük

+0

pozitif bakış açısı operatörü tam olarak ihtiyacım olan şeydi. Burada daha fazla bilgi: http://www.regular-expressions.info/lookaround.html – Paul

+0

Bu cevap olmalı. – GregoryBrad

İlgili konular