12 Şubat 2018 Pazartesi

Regex Sınıfı

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ız
string 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.
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());
}
Örnek
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.
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