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

16 Ocak 2015 Cuma

Tokenizing & Formating

      Bugünkü konumuzda tokenizing ve formating konusunu işleyeceğiz. Bir önceki konuda regex konusu ile birbirinden yakındır fakat mantık regex bulma işlemi yaparken burada büyük parçalardan küçük parçalara veya başka bir ifadeyle istenilen formata çevirme yöntemi vardır. Şimdi örneğimize geçersek ne demek istediğimizi daha iyi anlarız

public class StringSplitTest {
    public static void main(String[] args) {
        String content = "name1,name2,name3,name4";

        String[] names = content.split(",");
        for (String s : names) {
            System.out.println(s);
        }
        //burada virgüle göre parçalama yapıyoruz

        content = "name1,name2:name3:name4.name5@name6";
        System.out.println("virgul - iki nokta-nokta- @");
        names = content.split(",|:|\\.|@");
        // onceki yazida isledigimiz gibi ,birden fazla bölme parametresi de kullanabiliriz
        // benzer sekilde noktayi kullanmak icin kacis karakteriyle kullanılmalıdır. \
\.
        for (String s : names) {
            System.out.println(s);
            }
         }
      }

     Gördüğünüz gibi buradaki bir bütün olan metni kelimeler ayırdık. Bu ayırma işlemi boşluklara göre de
olabilirdi. Her boşlukta kelimeyi hafızaya alıp yazdırabilirdik veya satır satır alma işlemi de olaiblirdi.
Satır sonuna gelindiğinde satırı hafızaya da alabilirdi. Bu tip örnekler çoğaltılabilir tabii ki de ..
      Aşağıdaki kodda ise tokenizin işlemi ile searching işleminin arasındaki farkı daha iyi anlaycağınızı umuyorum.
 public static void main(String[] args) { Pattern p = Pattern.compile("\\s");//boşluk String content = "merhaba java!"; System.out.println("Searching Test"); Matcher m = p.matcher(content); while (m.find()) { System.out.print(m.start() + " "); // Searching islemi ilgili regexi bulma islemidir. } System.out.println(); String[] tokens = content.split("\\s"); System.out.println("Tokenizing Test"); for (String token : tokens) { System.out.println(token); // Split/tokenizing ise regexe göre parçalama işlemidir } } }

Şimdi de formating konusunda bakalım. Formating C'den yabancı olmadığımız bir konu. Aynı şey java için de 
geçerlidir. b boolean , c char, d integer, f floating point, s string kullanılır. Birazdan örneklerde göreceğimiz 
şekilde bu tanımlamalar böyle yapılır. Şimdi örnek kodumuza geçelim.

public static void main(String[] args) {

System.out.printf("%d", 10);
System.out.println();
  System.out.format("%d", 10);//format metonu da kullanabiliriz
  System.out.println();

//System.out.printf("%f",10);
// java.util.IllegalFormatConversionException hatasi verecektir.
// %f kayan noktali sayilar/kusuratli sayilar icindir.


System.out.printf("%2$d %1$d  %3$f", 123, 456, 10.4);
// index$ ifadesi ile arguman olarak verilen ddeğerleri düzenleyebiliriz.
System.out.println();//456 123 10.4

System.out.printf("%05d", 123);
// 0 , metoda sayimizin hanesini belirtir
                // sayımız 5 haneden büyükse her hangi bir değişiklik yapmaz
System.out.println();

System.out.printf("%+d %+d", 123, -123);
// Varsayilan olarak pozitif sayilarda + isareti eklenmez. + karakterini
// ekleyip formatlayabiliriz.
System.out.println();

System.out.printf("%(d %(d", 123, -123);
// ( parantez isareti negatif sayilari parantez icerisine alir.
// negatif sayiyiyi pozitif olarak formatlar , mutlak degerini alir.
System.out.println();

System.out.printf(">%d< \n", 123);
System.out.printf(">%7d< \n", 123);
System.out.printf(">%-7d< \n", 123);
// - karakteri formatlamayi sola dayali yapar.
}

15 Ocak 2015 Perşembe

Regex-Searching&Finding

      Bugünkü yazımızda birbirinden farklı fakat birbiriyle yakın konuları işleyeceğiz. Regex konusu ile başlayalım hemen , aşağıdaki örnekte yorum satırlarında açıklamalar var. Kafanızı karıştırmadan umarım sadece ve anlaşılır olabilir

public static void main(String[] args) {
Pattern p = Pattern.compile("a");//birden fazla harf de olabilir
// ilgili icerikte/content "www.java.com.tr" "a" harfini arar
             
Matcher m = p.matcher("www.java.com.tr");

while (m.find()) { //bu işlemler 1 kez çalışır!!
System.out.print(m.start() + " ");
}
             
System.out.println();
             
Pattern p3 = Pattern.compile("j|w|t");//"[jwt]" yapıların aynıdır
// arama yaparken or yapısını | ile kullanabiliriz
Matcher m3 = p3.matcher("www.java.com.tr");

while (m3.find()) {
System.out.print(m3.start() + " ");
}
System.out.println();
             

Pattern p5 = Pattern.compile("[jwt][ar]");
// ilk 3 karekterden herhanginden biri sonrası 
                //sonraki a veya r'den biri gelmelidir
Matcher m5 = p5.matcher("www.java.com.tr");

while (m5.find()) {
System.out.print(m5.start() + " ");
}

System.out.println();
Pattern p6 = Pattern.compile("[a-z]");
// a-z arasında tüm karekterleri alır
                //dikkat edin noktaları ve 'R' almaz
                //aynı şey rakamlar için de geçerlidir
Matcher m6 = p6.matcher("www.java.com.tR");

while (m6.find()) {
System.out.print(m6.start() + " ");
}
System.out.println();
             
Pattern p8 = Pattern.compile("[^ajw]");
// caret ajw dışındakileri bul demektir. Değilini almak gibi
Matcher m8 = p8.matcher("www.java.com.tr");

while (m8.find()) {
System.out.print(m8.start() + " ");
}

}

    Yukarıda bazı ifadeler görüyoruz. Örneğin ; [a-z] bu ne demekti , a ile z arasındaki tüm karekteri al , veya [0-9] tüm rakamları al demektir. Peki bunun kısa bir yolu yok mu ? Onun için de matekarekter diye ifade ettiğimiz bir kavram var. Şimdi onu verelim . Ondan sonra da bir örnekle konuyu daha iyi inceleyelim

public static void main(String[] args) {

Pattern p = Pattern.compile("\\d");
// \d -> [0-9] anlamina gelmektedir.
                // \\D -> [0-9] dışındaki karekterleri içerir
Matcher m = p.matcher("java1 reg2ex!");

while (m.find()) {
System.out.print(m.start() + " ");
}


Pattern p3 = Pattern.compile("\\s");
// \s -> bosluk karakterini bulur.
                // \SS -> boşluk dışındakileri bulur
Matcher m3 = p3.matcher("java1 reg2ex!");

System.out.println();
while (m3.find()) {
System.out.print(m3.start() + " ");
}

Pattern p5 = Pattern.compile("\\w");
// \w -> harf veya rakam
                // \\W-> harf ve rakam dışındakiler
Matcher m5 = p5.matcher("java1 reg2ex!");

System.out.println();
while (m5.find()) {
System.out.print(m5.start() + " ");
}

Pattern p7 = Pattern.compile("a.c");
// . karekteri buraya her hangi bir karekter gelebilir demektir

Matcher m7 = p7.matcher("ac abc a c a  d");
// ac yi almaz cunku arada bir karakter yok.
// abc , a c yi alır . ac almaz arada birşey yoktur
System.out.println();
while (m7.find()) {
System.out.print(m7.start() + " ");
}

}

    Şimdi de bu ifadelerin sayıları ile ilgili bir örnek verelim. Mesela ab'den sonra kaç tane karekter gelebilir veya ab'den sonra her hangi birşey gelsin mi gelmesin gibi şeyler de talep edilebilmektir. Bunun için + ? * gibi ifadeler yer almaktadır. Şimdi örnekteki kodda ne demek istediğimizi umarız daha iyi anlatabiliriz.

public static void main(String[] args) {

Pattern p = Pattern.compile("\\w");
Matcher m = p.matcher("1 a12 234b");

while (m.find()) {
      System.out.println("start : " + m.start() + " end :" +
                                                  m.end() + " content:" + m.group());
     // start metodu match/eslesen regex icin baslangic indexi verir.
      // end metodu match/eslesen regex icin baslangic indexi verir.
// group metodu match/eslesen regexi verir.
}

Pattern p2 = Pattern.compile("\\d+");
                // + karakteri 1 veya daha fazlası
                // * karekteri 0 veya daha fazlası
                // ? 0 veya 1 tane anlamına gelir
                // \\d{n} n tane rakam içermesine bakar 
Matcher m2 = p2.matcher("1 a12 234b");
System.out.println("one or more");
while (m2.find()) {
System.out.println("start : " + m2.start() + " end :" +
                                                    m2.end() + " content:" + m2.group());
}

//burada karışık bir örnek var. Siz de böyle çalışmalar yapabilirsiniz
Pattern p5 = Pattern.compile("0[xX][0-9a-fA-F]");
// 0 ile baslasin 2.karakter x veya X olsun sonrasinda rakam(0-9) 
                //ya da a-f ya da A-F arasinda harf olsun.
Matcher m5 = p5.matcher("12 0x 0x12 0Xf 0xg");
System.out.println("more regex");
while (m5.find()) {
System.out.println("start : " + m5.start() + " end :"  +
                                                    m5.end() + " content:" + m5.group());
}

}