6 Ekim 2020 Salı

Matcher Sınıfı

Giriş
Şu satırı dahil ederiz
import java.util.regex.Matcher;
Bu sınıfın ana kullanım amacı Capture Group'lara erişmek. Matcher nesnesi Pattern tarafından yaratılır

find metodu
Eşleşmeleri teker teker bulur.

Örnek
Şöyle yaparız.
String line = "XYZ Q|1|^123456<CR>";
Pattern queryRegex = Pattern.compile("Q\\|\\d\\|(.+?)<CR>");

Matcher queryMatcher=queryRegex.matcher(line);
if (queryMatcher.find()) {
    System.out.println("Group 0: " + queryMatcher.group(0));
    System.out.println("Group 1: " + queryMatcher.group(1));
}
İlk çıktı her zaman tüm eşleşmedir. İkinci sonuç ise ilk gruptur.
Group 0: Q|1|^123456<CR>
Group 1: ^123456
Örnek
Bazen find metodunu döngü içinde kullanmak gerekir.
String s = "...";
Matcher m = Pattern.compile("[^,()]+|\\([^)]*\\)").matcher(s);
while (m.find())
  System.out.println(m.group());
group metodu
group (0) değerini yani tüm eşleşmeyi verir.

Örnek
$...$ arasındaki kelimeleri bulmak için şöyle yaparız.
String x = "Hey my name is $name$; I have $years$ years old," + 
           "and I love play $sport$ and I live in $country$ !";
Pattern p = Pattern.compile("\\$\\w+\\$");
Matcher m = p.matcher(x);
Map<String, Integer> map = new LinkedHashMap<>();

while(m.find()) {
  String in = m.group().substring(1,m.group().length()-1);
  map.put(in, in.length());
}
Örnek
Şöyle yaparız.
Pattern p = Pattern.compile("(?<!\\d)\\d{2}:\\d{2}(?!\\d)");
Matcher m = pattern.matcher(inputString);

if (m.find()) {
    System.err.println("Time: " + m.group());
}
group metodu - int
Belirtilen yakalama grubunu döndürür.
Örnek
Elimizde şöyle bir string olsun.
String timeStr = "10:15:34";
Şöyle yaparız.
Pattern p = Pattern.compile("(\\d+):(\\d+):(\\d+)");
Matcher m = p.matcher(timeStr);
if (m.matches()) {
  int hours = Integer.parseInt(m.group(1));
  int minutes = Integer.parseInt(m.group(2));
  int seconds = Integer.parseInt(m.group(3));
  ...
}
groupCount metodu
Tüm eşleşen grupları verir. Şöyle yaparız.
String str="asd14sd67fgh007";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}
matches metodu
Verilen string ile düzenli ifadenin tam olarak eşleşip eşleşmediğini döner. C#'taki RegEx.IsMatch metodu ile aynıdır.
String s = "...";
Pattern pattern = Pattern.compile("...");

Matcher matcher = pattern.matcher(s);
// Check if pattern matches 
if (matcher.matches()) {
  ...
}  
quoteReplacement metodu
Açıklaması şöyle
Use Matcher.quoteReplacement(java.lang.String) to suppress the special meaning of these characters, if desired.
Örnek
Şöyle yaparız
String content = "<xxx.xx.name>xxx.xxx.com:111</xxx.xx.name>";
String destination = Matcher.quoteReplacement("${VAR}");
String source = "xxx.xxx.com:111";
content = content.replaceAll(source, destination);
Çıktı olarak şunu alırız
<xxx.xx.name>${VAR}</xxx.xx.name>
reset metodu
Ne işe yarar bilmiyorum. Şöyle yaparız.
Matcher matcher = ...;
matcher.reset();
results metodu
results metodu yazısına taşıdım

Hiç yorum yok:

Yorum Gönder