11 Kasım 2015 Çarşamba

String Split

Giriş
String ile çalışırken Split ve Tokenizer şeklinde iki farklı yöntem karşımıza çıkıyor.
Aralarındaki fark şöyle :
Split ile verilen cümle değerlerine ayrıştırılıp bir dizi dönülür. Tokenizer ile değerler teker teker alınır.

Split
C
C ile gelen sscanf split işlemi için kullanılabilir.Buradaki örnekte verilen "192.168.0.100/act?bla=" string'i sscanf ile ? ve = işaretlerinden sonra bölünüyor.

sscanf %s yerine %19s gibi ayrılması istenen kısmın büyüklüğünü belirtecek şekilde de kullanılabilir. Örnek:

boost
boost::split() ile string split edilirken birden çok karaktere göre split edilebilir. 

string key = ...;
vector<string> strs;
boost::split(strs,key, boost::is_any_of("|"));
Bir başka örnek ise buradan geldi.
#include <vector>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/split.hpp>

std::vector<std::string> path_parts;
std::string s("some/file/path");
boost::split(path_parts, s, boost::is_any_of("/"));

C#
C# ile gelen String.Split() metodu Java'dakini aksine düzenli ifade kullanmıyor. Düzenli ifade kullanmak için Regex.Split() metodunu kullanmak lazım.

Bir stringi birden çok karaktere göre split etmek için aşağıdaki örnek kullanılabilir.

Bir string birden çok stringe göre split etmek için aşağıdaki örnek kullanılabilir.
 
Java
String'i split etmek için düzenli ifadeler kullanılıyor. Örneğin aşağıdaki örnekte kelimeler ayraç olarak kullanılıyor.

Eğer split edilecek bir şey yoksa original string geri döndürülür.
If the expression does not match any part of the input then the resulting array has just one element, namely this string.
System.out.println("Output1: "+"".split(",")); //"" döndürür

split metodu aslında şu imzaya sahip
split(String regex, int limit)
limit parametresi sonucun en fazla ne kadar uzunluğua sahip olmasını istediğimizi belirtir.
default olarak 0 değerine sahiptir.

0 ise : empty string'ler sonuca dahil edilmez.
> 0 ise : en fazla verilen sayı uzunluğunda bir dizi döndürülür. empty string'ler sonuca dahil edilmez.
< 0 ise : en fazla verilen sayı uzunluğunda bir dizi döndürülür. empty string'ler sonuca dahil edilir.

Guava
Splitter ile Stringleri belli karakterlere göre ayırmak çok kolay.

Splitter niceCommaSplitter = Splitter.on(',').omitEmptyStrings().trimResults();
niceCommaSplitter.split (list);

Splitter ve CharMatcher
Splitter sınıfı alt tarafta bir şekilde CharMatcher sınıfını kullanıyor. Burada CharMatcher sınıfının static class initialization metodlarının yavaş olduğundan şikayet edilmiş.
 
Whitespace
Splitter ile StringTokenizer benzer işleri yapıyorlar ancak Java StringTokenizer respects exactly five whitespace characters and nothing else sorusunda da açıklandığı gibi Splitter.on(CharMatcher.WHITESPACE) kodu ile whitespace'leri ayırmak çok daha kolay.

Digits
Örnekte verilen metin içinden rakamlar seçiliyor. Bunu yapmak için ayraç olarak "rakam olmayanlar" kullanılıyor.
Iterator<String> iter = Splitter.on(CharMatcher.JAVA_DIGIT.negate()).
    trimResults().
    omitEmptyStrings().
    split(text).
    iterator();
List<Integer> result = new ArrayList<Integer>();
while (iter.hasNext()) {
    result.add(Integer.parseInt(iter.next()));
}   
Splitter vePatterr
Pattern verilerek düzenli ifade kullanarak ayırma yapmak çok kolay. Örnek:

Tokenize - Karakter ile
Konuyu String Tokenizer başlıklı yazıya taşıdım.

Tokenize - Düzenli İfade ile

boost
Örneği buradan aldım.Aşağıdaki kod ile sadece tokenlar gelir.
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
Token olmayan kısımları almak için 
boost::sregex_token_iterator begin(s.begin(), s.end(), re);
kullanılır.

sregex_iterator'da  sregex_token_iterator ile çok benzer ancak sadece eşleşen kısımları (yani token olarak düşünülecek kısımları) bulmaya yarar.
Java
Is there a way to split strings with String.split() and include the delimiters? ve How to split a string, but also keep the delimiters? sorularında hem token'lara ayırmanın hem de ayraçları almanın yolları gösterilmiş.
Örnek:

Hiç yorum yok:

Yorum Gönder