SORU
10 Mayıs 2013, Cuma


Kelimeler Dize kullanarak çıkarma bulabilirsiniz.()split

String olarak verilen

String input = "one two three four five six seven";

Var String.split() ile () bir anda iki kelime, öyle ki kapmak için çalışan bir düzenli ifade:

String[] pairs = input.split("some regex");
System.out.println(Arrays.toString(pairs));

bu sonuçlar:

[one two, three four, five six, seven]

Not:Bu soru hakkındabölünmüş düzenli.değil"bulmanın bir yolu" veya diğer "başka bir şekilde çalışmasını sağlayan" çözümler.

CEVAP
10 Mayıs 2013, Cuma


Şu anda split() ama gerçek dünya bu yaklaşım kullanmayın ile yapmak mümkündür. Kullanın Pattern Matcher Bu davranış gelecek sürümlerde değişebilir beri incelir ve bakım cehenneme overcomplicating önlemek için sınıfları veya Java gibi Android gibi ortamlar.


Aradığınız şey bu mu? (sen-ebilmek değiştirmek \\w \\S dahil olmayan tüm boşluk karakterleri ama bu örnek bırakacağım \\w beri daha kolay analiz için düzenli ifade ile \\w\\s \\S\\s)

String input = "one two three four five six seven";
String[] pairs = input.split("(?<!\\G\\w )\\s");
System.out.println(Arrays.toString(pairs));

çıkış:

[one two, three four, five six, seven]

\G önceki maçı (?<!regex) negatif geriye ilerleme.

split için çalışıyoruz

  1. boşluk - ^ bulun . \\s
  2. - ^tahmin edilmektedir . (?<!negativeLookBehind)
  3. - ^birkaç kelime . \\w
  4. önceden eşleşen (space) ile->\\G
  5. bu -^ önce. \\G\\w .

Başlangıçta sadece benim sahip olduğum karışıklığı nasıl bu alanı istediğimiz bu yana ilk uzay için bunu göz ardı edildi.Önemli bilgileri başlangıçta \\G String ^ başlangıç eşleşen.

İlk yineleme önce düzenli negatif-arkasına bak (?<!^\\w ) gibi görünecek ve ilk alanı beriyapın^\\w önce, split maç olamaz. Bir sonraki uzay uyumlu olacak ve bu konuda bilgiler bu sorun olmaz (onun gibipozisyoninput String) \\G ve negatif gelecek daha sonra saklanan kullanılacaktır bak arkada.

3 alanı düzenli \\G kelime \\w daha önce önceden eşleşen alanı olup olmadığını kontrol etmek. Beri sonuç bu test pozitif, negatif bak-arkasında alışkanlık kabul bu yüzden bu alanı alışkanlık eşleştirilecek, ama 4. alanı alışkanlık var bu sorun çünkü boşluktan önce bu alışkanlık aynı olarak kayıtlı \\G (olacak farklı pozisyonda input Dize).


Ayrıca eğer biri için ayrı diyelim ki her 3 alanı kullanabilirsiniz Bu form (temel @maybeWeCouldStealAVananswer silindi zaman yayınlanan bu fragmanın cevap)

input.split("(?<=\\G\\w{1,100}\\s\\w{1,100}\\s\\w{1,100})\\s")

100 yerine Dize en az uzunluk boyutu En Uzun kelime olacak daha büyük bir değer kullanabilirsiniz.


Ben de örneğin 3, 5, 7 gibi her her tek sayı ile bölmek istiyorsak {1,maxWordLength} yerine kullanabileceğimizi fark ettim

String data = "0,0,1,2,4,5,3,4,6,1,3,3,4,5,1,1";
String[] array = data.split("(?<=\\G\\d ,\\d ,\\d ,\\d ,\\d ),");//every 5th comma 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • circuschina

    circuschina

    16 Mart 2007
  • metal571

    metal571

    30 Mayıs 2006
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007