2010-08-22 27 views

cevap

29

aşağıdaki gibi satır içi değiştiricilerini kullanabilirsiniz:

// case insensitive match 
Regex MyRegex = new Regex(@"(?i)[a-z]+"); // case insensitive match 

ya, eksi işareti ekleyerek değiştirici anlamını ters:

// case sensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+"); // case sensitive match 

ya, onları geçmek açma ve kapatma:

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i)[a-z]+(?i)[k-n]+"); 
Böyle tek seferde birden değiştiricileri kullanabilirsiniz

// case sensitive, then case-insensitive match 
Regex MyRegex = new Regex(@"(?-i:[a-z]+)(?i:[k-n]+)"); 

:

Alternatif olarak, yalnızca bu gruba değiştirici kapsamları iki nokta üst üste : ve gruplama parantez kullanılarak mod-değiştirici yayılma sözdizimi kullanabilirsiniz (?is-m:text), ya da başka bir sonra, o temizleyici (?i)(?s)(?-m)text (Ben) bulursanız. Açık/kapalı anahtarlama sözdizimini kullandığınızda, değiştiricinin bir sonraki anahtara veya normal ifadenin sonuna kadar çalıştığını unutmayın. Tersine, mod değiştirilmiş açıklıkları kullanarak, yayından sonra varsayılan davranış geçerli olur. Son olarak

:

x boşluk sağlar ve
s tek hat modu
m çoklu hat modu
i durumda duyarsızlık
yorumlar: vardır (modunu tersine bir eksi kullanın) .NET izin modifiye n yalnızca açık yakalamaya izin verir (.NET'e özgü)

+1

Teşekkürler. Yani eğer birden fazla değiştirici kullanmak istersem, sadece (? I) 'yerine' (? Imsx) 'yi yapıyorum? – Aillyn

7

Bu şekilde kullanın:

Regex MyRegex = new Regex(@"(?i:[a-z]+)"); 

önek (?<option>:<pattern>) ile desenine satır içi seçeneği. Bu durumda IgnoreCase için seçenek "i" dir.

Yukarıdaki iki nokta üst üste belirterek, yalnızca o desene ayarlı olursunuz. seçenek kendi başına bunu başlangıçta ayarlayabilirsiniz Tüm örneğin uygulanır hale getirmek için:

@"(?i)[a-z]+" 

Birden seçenekleri kullanabilirsiniz ve bunları açmak ve kapatmak da mümkündür:

// On: IgnoreCase, ExplicitCapture. Off: IgnorePatternWhitespace 
@"(?in-x)[a-z]+" 

Bu tüm modelde RegexOptions kullanıldığında mümkün olmayan farklı bir noktadaki seçenekleri etkinleştirmek/devre dışı bırakmak için bir modelde esneklik sağlar.

Biraz ayrıntılı bir örnek aşağıdadır.Seçeneklerin ne zaman etkili olduğunu anlamak için onunla oynamanızı tavsiye ederim.

string input = "H2O (water) is named Dihydrogen Monoxide or Hydrogen Hydroxide. The H represents a hydrogen atom, and O is an Oxide atom."; 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
string pattern = @"di?(?nx-i) (hydrogen) | oxide"; 
var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups[1].Captures.Count); 
} 

Console.WriteLine(); 

// n = explicit captures 
// x = ignore pattern whitespace 
// -i = remove ignorecase option 
// -x = remove ignore pattern whitespace 
pattern = @"di?(?nx-i) (?<H> hydrogen) (?-x)|oxide"; 
matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); 
Console.WriteLine("Total Matches: " + matches.Count); 
foreach (Match match in matches) 
{ 
    Console.WriteLine("Match: {0} - Groups: {1}", match.Value, match.Groups["H"].Captures.Count); 
} 

yukarıda çıktısı şudur: her iki desen RegexOptions.IgnoreCase de

Total Matches: 3 
Match: Dihydrogen - Groups: 0 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

Total Matches: 3 
Match: Dihydrogen - Groups: 1 
Match: oxide - Groups: 0 
Match: oxide - Groups: 0 

"Dihidrojen" (büyük D) eşleşen ve böylece "di" durum duyarsız olmasını sağlar kullanılmaktadır ve kapanır. Açık yakalama açık olduğundan, ilk örnek, (hydrogen) için herhangi bir gruba sahip değildir, çünkü adlandırılmış bir grup kullanmaz, bu da açıkça yakalama gereksinimidir. İkinci model (?<H> hydrogen) kullandığı için 1 gruba sahiptir.

Ardından, ikinci desenin sonunda (?-x)|oxide'u kullanmak üzere değiştirildiğini fark edin. IgnorePatternWhitespace, hidrojen yakalama işleminden sonra devre dışı bırakıldığından, desenin geri kalanı, daha sonra desende (?x) açık olarak açılana kadar ek beyaz boşluk (birinci kalıpla karşılaştırın) içermeyecek şekilde doğru şekilde oluşturulmalıdır. Bu, gerçek bir amaca hizmet etmez, ancak gerçekte ne zaman başladıklarını göstermek için inline seçeneklerinin derinlemesine kullanılmasını gösterir.