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.