Matcher etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Matcher etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

3 Mayıs 2023 Çarşamba

Matcher.replaceAll metodu

Giriş
İmzası şöyle
String replaceAll(Function<MatchResult,String>)
Örnek
Şöyle yaparız.
var str = "Anyone born between 1981 and 1996 is considered a candidate";

var r = new Random();

var str2 = Pattern.compile("[0-9]+").matcher(str)
        .replaceAll(m -> String.valueOf(Integer.parseInt(m.group()) + r.nextInt(5)));

System.out.println(str2);
// Anyone born between 1983 and 1999 is considered a candidate

Matcher.results metodu

Giriş
İmzası şöyle
Stream<MatchResult> results()
Java 9 ile geliyor. Matcher.find() çağrısını döngü içinde yapmak yerine Strema ile kullanmayı kolaylaştırıyor

Örnek
Şöyle yaparız. Burada eski kodlarda Matcher.find() sonucu bir liste içinde toplanıyor sonra işleniyor. Yeni kodlardaysa Matcher.results() direkt Stream döndürüyor
var str = """
List<String> results = stream
  .filter(s -> pattern.matcher(s).matches()).toList();
""";

Matcher m = Pattern.compile("[\\p{L}]+").matcher(str); // letters

// Eski kod
var words = new LinkedList<>();
while (m.find()) {
  words.add(m.group());
}

System.out.println(words);
// [List, String, results, stream, filter, s, pattern, matcher, s, matches, toList]

m.reset();

// Yeni kod
var words2 = m.results().map(MatchResult::group).toList();

System.out.println(words2);
// [List, String, results, stream, filter, s, pattern, matcher, s, matches, toList]


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