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.
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.
split metodu aslında şu imzaya sahip
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.
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.
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:
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.
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.
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# 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()).Splitter vePatterr
trimResults().
omitEmptyStrings().
split(text).
iterator();
List<Integer> result = new ArrayList<Integer>();
while (iter.hasNext()) {
result.add(Integer.parseInt(iter.next()));
}
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