Birden çok sınırlayıcıyla String.split () kullanın


201

Ben ayırıcı -ve bir dize tabanı bölmek gerekiyor .. Aşağıda benim istenen çıktı.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

ancak aşağıdaki kodum çalışmıyor.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

Söylediklerinize dayanarak, iyi çalışıyor gibi görünüyor. İstediğiniz çıktı nedir?
Jeff

2
@Jeff: İstediği çıkışı gösterdi ( AA/ BB/ CC...)
TJ Crowder

2
Emin misiniz? Bunu mevcut çıktısı olarak yorumladım, istenen çıktısı olarak değil. Belki ayağa kalkma ve biraz dolaşma zamanı.
Jeff

@Jeff: Karışıklık için özür dilerim, yanlış anlaşılmanızı gidermek için yazımı güncelledim.
Thang Pham

Regex performansınızı düşürecektir. Gerekirse karakter karakter ve bölünmüş dize gidecek bir yöntem yazmak tavsiye ederim. Günlük (n) performansını elde etmek için bu ayrıntıyı optimize edebilirsiniz.
Princesh

Yanıtlar:


311

Normal ifade VEYA operatörünü eklemeniz gerektiğini düşünüyorum :

String[]tokens = pdfName.split("-|\\.");

Sahip olduklarınız:
[DASH ve ardından DOT birlikte] -.
değil
[DASH veya DOT bunlardan hiçbiri] -veya.


9
neden iki ters eğik çizgi istiyoruz ??
pjain

7
.Regex karakter yeni bir satır dışında bir karakterle ifade eder. tutorialspoint.com/java/java_regular_expressions.htm Ancak bu durumda, gerçek karakteri istediler .. İki ters eğik çizgi, bahsettiğinizi gösterir .. Ters eğik çizgi bir kaçış karakteri.
Monkeygrinder

2
normal durumlarda .split("match1|match2"), (örn. split("https|http")), \\ .yukarıdaki durumda özel karakterden kaçmak olacaktır
prayagupd

veya genellikle pdfName.split("\\W");aşağıdaki gibi kullanabilirsiniz: Peter Knego answer
ahmednabil88

1
kullanmak [-.]yerine-|\\.
Saeed

49

Bu normal ifadeyi deneyin "[-.]+". + After ardışık sınırlayıcı karakterleri bir olarak ele alır. Bunu istemiyorsanız artıyı kaldırın.


8
@Lurkers: Peter'ın kaçmak zorunda olmasının tek nedeni , içindeki ilk düşünce -olmasıydı , aksi takdirde önünde bir ters eğik çizgi olması gerekiyordu (ve elbette önüne bir ters eğik çizgi koymak için, biz iki tane gerekir çünkü bu bir dize değişmezidir). []
TJ Crowder

Bence bu cevap kabul edilenden daha iyidir, çünkü mantıksal operatörü | kullandığınızda sorun, sınırlayıcılarınızdan birinin sonuç 'belirteçlerinin' bir parçası olabilmesidir. Bu Peter Knego'nun [-.] +
Jack '

26

Regex "\ W" kullanabilirsiniz. Bu, herhangi bir sözcük olmayan karakterle eşleşir. Gerekli satır:

String[] tokens=pdfName.split("\\W");

benim için çalışmıyor `` String s = "id (INT), name (STRING),". Burada \\ W kullanmak, sadece 4 olması gerektiği gibi bir uzunluk 6 dizisi oluşturur
user3527975

2
Bu, giriş Unicode karakteri içerdiğinde de kesilir. İle "kapmak" yerine, sadece gerçek sınırlayıcı dahil etmek en iyisidir \W.
nhahtdh

13

Verdiğiniz splitdize, normal ifadenin dize biçimidir, bu nedenle:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Bu, içindeki herhangi bir karaktere bölünmek anlamına gelir []( -içinde ters eğik çizgiden kaçmak zorundayız çünkü içeride özeldir []; ve elbette ters eğik çizgiden kaçmalıyız çünkü bu bir dizedir). (Tersine, .normalde özeldir ancak içinde özel değildir[] .)


Bu durumda kısa çizgiden kaçmanıza gerek yoktur, çünkü [-.]muhtemelen bir aralık olarak yorumlanamaz.
Alan Moore

1
@Alan: Çünkü sınıftaki ilk şey, bu oldukça doğru. Ama her zaman yaparım, daha sonra geri dönüp düşünmeden önüne bir şeyler eklemek çok kolay. Kaçmanın hiçbir maliyeti yok, bu yüzden ...
TJ Crowder

köşeli parantezlerden nasıl kaçacağını biliyor musun? "200", "Mühendislik" olarak ayrılmak istediğim String "[200] Mühendislik" var
scottysseus

3
Oh vay anladım ... Bir yerine iki ters eğik çizgi kullanmak zorunda kaldım. String[] strings = codes.get(x).split("\\[|\\]| ");<- ilgilenen herkes için kod
scottysseus

13

Guava kullanarak şunları yapabilirsiniz:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

5

"VE" ve "VEYA" sınırlayıcıları olarak iki karakter dizisi için bu çalışılmalıdır. Kullanırken kırpmayı unutmayın.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Sonuç: şehirler = {"İSTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSKOVA"}


{"İSTANBUL VE", "NEW YORK VE", "PARİS VEYA", "TOKYO VE", "MOSKOVA" gibi çıktıları nasıl alabilirim
Ahamadullah Saikat

3

Apache Commons kullanırdım:

ithalat org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Komut StringUtils.splitByWholeSeparator(str, separator)dizesinin tamamını ayırıcı olarak kullanan belirtilen ayırıcılardan herhangi birine bölünür


3
String[] token=s.split("[.-]");

10
Lütfen StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu yönündeki yanlış anlaşılmayla, yalnızca kodla ilgili cevabınızı biraz açıklayarak artırın.
Yunnosch

2

Bunun gibi bir şey kullanmak daha iyidir:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

Örnek olarak birkaç karakter daha eklediniz. Bu en güvenli kullanım yoludur, çünkü yol .ve 'tedavi edilir.


1

Ayrıca split () yönteminde normal ifadeyi bağımsız değişken olarak da belirtebilirsiniz .. aşağıdaki örneğe bakın ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

Bu kodu deneyin:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

2
Lütfen StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu yönündeki yanlış anlaşılmayla, yalnızca kodla ilgili cevabınızı biraz açıklayarak artırın.
Yunnosch

0
s.trim().split("[\\W]+") 

çalışmalı.


2
İlk olarak, hayır, çalışmıyor - belki göndermeden önce deneyebilirsiniz? O zaman bu cevap seninle aynı - ama çalışıyor. Son olarak formasyonunuzu kontrol etmelisiniz ( çalışmalıdır. ).
Ekim'deki Arount

1
Lütfen StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu yönündeki yanlış anlaşılmayla, yalnızca kodla ilgili cevabınızı biraz açıklayarak artırın.
Yunnosch

-1

Sokmanın her zaman aynı formatta olacağını biliyorsanız, önce dizeyi temel alarak bölün ve dizeyi .bir değişkenin ilk dizininde saklayın. Daha sonra dizeyi ikinci dizine bölün ve -0, 1 ve 2 dizinlerini saklayın. Son olarak, önceki dizinin dizin 2'sini temel alarak bölün .ve ilgili tüm alanları edinmiş olmanız gerekir.

Aşağıdaki snippet'e bakın:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
Bir adımda yapılabilir, bu yüzden bir adımda yapın. Diğer yanıtlara bakın.
Kaj

2
pdfName.split(".")sıfır uzunluklu bir dizi ile sonuçlanır.
Alan Moore

1) .Kaçmak gerekiyor\\.
Shri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.