1. Look Around
Positive Look Ahead
q'dan sonra ] karakteri geldiğini anlamak için positive look ahead yapmak gerekir. İleriye bakmak için şöyle yaparız.
q(?=])
Elimizde bir liste olsun
List<String> list = new ArrayList<>();
list.add("birthday54");
list.add("happy75");
list.add("nifty43");
list.add("bob1994");
Rakama kadar olan kısmı ve rakamı ayrı ayrı yakalamak için şöyle yaparız. ?=\d positive look ahead ile rakama kadar olan kısım yakalanır.
String[] split = str.split("(?=\\d)(?<!\\d)");
Negative Look Aheadq'dan sonra ] karakteri gelmediğini anlamak için negative look ahead yapmak gerekir. İleriye bakmak için şöyle yaparız.
q(?!])
Positive Look Behind
q'dan önce ] karakterini geldiğini anlamak için positive look behind yapmak gerekir. Geriye bakmak için şöyle yaparız
(?<=])q
Negative Look Behind
q'dan önce ] karakterini gelmediğini anlamak için negative look behind yapmak gerekir. Geriye bakmak için şöyle yaparız
(?<!])q
2. Non-Greedy Matches
Regex.Matches greedy başlar. Elimizde şöyle bir string olsun
string input1 = "This is <a> <test> mat<ch>.";
Tüm <..> arasındaki karakterleri bulmak isteyelim. Bu durumda iki seçeneğimiz var.
1. Non-greedy eşleşme yapmak. Non-greedy için .*? karakterlerini kullanırız
var m1 = Regex.Matches(input1, @"<(.*?)>");
2. Negation karakteri kullanmak
Negation için ^ karakterini kullanırız
var m1 = Regex.Matches(input1, @"<([^>]*)>");
Daha sonra her eşleşme şöyle dolaşılır
foreach (Match match in m1)
{
list.Add(match.Value);
}
Çıktı olarak şunu alırız. Örnekte Match nesnesinden capture edilen group alınmıyor.
1. <a>
2. <test>
3. <ch>
3. Regex Sınıfı
Bu sınıf için şu satırı dahil etmek gerekir. Bu sınıfın hem static hem de static olmayan ve aynı işi yapan metodları var.using System.Text.RegularExpressions;
Constructor
Şöyle yaparız.string strRegex = @"...";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
Escape metodu
Şöyle yaparızstring strRegEx = "...";
var pattern = Regex.Escape(strRegEx
);
Düzenli ifadenin içinde [ karakteri olsun
@"[Enter address here]";
[ karakterini şöyle yazmamız gerekir.
@"\[Enter address here\]";
Bun Escape metodu ile kolayca yaparız.
IsMatch metodu - Tamamen Eşleşme
Verilen string ile Regex'in tamamen eşleşip eşleşmediğini döner.String toFind = "...";
String pattern = "..."
if (Regex.IsMatch(strLine, pattern)) {...}
Bazen IsMatch yerine String sınıfının Containes ve IndexOf metodları çok daha basit çözümler sunabiliyor.
Match metodu
Match nesnesi döner.
Örnek
İlk eşleşmeyi bulmak için şöyle yaparız.
Örnek
Şöyle yaparız.
Aslında MatchCollection nesnesini aradan çıkartmak çok kolay. 3 grubu yakalayan bir düzenli ifademiz olsun. Her Match nesnesi içinde Value ve 3 tane grup bulunur. Gruplar 1'den başlar.
string resultString = Regex.Match(str, @"\d+").Value;
Örnek
Şöyle yaparız.
string sentence = ...;
string pattern = ...;
Match matching = Regex.Match(sentence, pattern, RegexOptions.IgnoreCase);
if (matching.Success)
{
Console.WriteLine(matching);
}
else {
Console.WriteLine("Keyword not found!");
}
Matches metodu- Tüm Eşleşmeleri Alma
MatchCollection döner. Tüm eşleşmeleri verir.Örnek
Şöyle yaparız.
// Loop thrue all matches
foreach (Match match in regex.Matches("..."))
{
Console.WriteLine(match.Value);
}
Örnek
Şöyle yaparız.
var results = Regex.Matches(s, @"...")
.Cast<Match>()
.Select(x => x.Groups[1].Value);
Örnek
Şöyle yaparız. Match nesnesinden capture edilen gruplar GroupCollection olarak alınabilir.
string myString = "B12";
Regex rx = new Regex(@"[A-Za-z](\\d+)");
MatchCollection matches = rx.Matches(myString);
if (matches.Count > 0)
{
Match match = matches[0]; // only one match in this case
GroupCollection groupCollection = match.Groups;
Console.WriteLine("serial " + groupCollection[1].ToString());
}
ÖrnekAslında MatchCollection nesnesini aradan çıkartmak çok kolay. 3 grubu yakalayan bir düzenli ifademiz olsun. Her Match nesnesi içinde Value ve 3 tane grup bulunur. Gruplar 1'den başlar.
var matches = Regex.Matches(s, @"(...)(...)(...))");
foreach (Match m in matches) {
Console.WriteLine("Match:" + m.Value);
Console.WriteLine("Group[1]: " + m.Groups[1].Value);
Console.WriteLine("Group[2]: " + m.Groups[2].Value);
Console.WriteLine("Group[3]: " + m.Groups[3].Value);
}
Replace metodu
Belli bir örüntü şöyle değiştirilir.string Result = Regex.Replace("estA M123456 testB", "M[0-9]{6}", "www.test.com");
Replace metodu aynı zamanda MatchEvaluator da alabilir.
private static Dictionary<int, string> knownLinks = new Dictionary<int, string>()
{
{123456, "www.test.com"},
{999999, "www.foo.com"},
};
private static string LinkReplacer(Match match)
{
int linkNumber = Convert.ToInt32(match.Groups[1].Value);
string link = knownLinks[linkNumber];
return link;
}
public static void Replace()
{
string text = "testA M123456 testB Result M999999 testC";
string replacedText = Regex.Replace(text, "M([0-9]{6})", LinkReplacer);
Console.WriteLine(replacedText);
}
// output: testA www.test.com testB Result www.foo.com testC
Split metodu
Şöyle yaparız.
string strRegex = @"...";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
string strTargetString = @"...";
return myRegex.Split(strTargetString);
Unescape metodu
Şöyle yaparız.
var str = @"Hey \uF32A what's up?";
Regex.Unescape(str);
Hiç yorum yok:
Yorum Gönder