Java 13 Metin Bloğu * OLMADAN * satırsonu


12

"""Sınırlayıcılara sahip Java 13 çok satırlı metin bloğu özelliği iyi biliniyor.

Ancak katıştırılmış yeni satırlar olmadan tüm paragraflara ihtiyaç duyduğum yinelenen bir gereksinim var.

Başka bir deyişle, aşağıdaki kod snippet'i:

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """"
System.out.println(paragraph);

beklediğiniz gibi aşağıdakileri üretir:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... bu genellikle çok faydalıdır. Ancak benim durumumda, özellikle büyük paragraflar için bunu üretmek için ihtiyacım var:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... ve daha sonra metin akışı ile ilgilenin.)

Üçlü tırnak özelliği için "satırsonu yok" parametresi oluşturmanın bir yolu var mı?


Bir HTML belgesinin daha sonra parçası olacak veya yeniden boyutlandırılabilir bir iletişim kutusuna benzer şekilde akan çok miktarda metin girdiğinizi düşünün. Ben verilerin çok "çizgileri" değerinde girmek isteyen olmadan"line" + "line" + "line" , vb ve EOL doldu göstermeden. Bu kadar geniş ve bakımı zor sözdiziminden kaçınmak tamamen arkadaki nokta """.
alife

Yanıtlar:


16

Bu özelliğin tasarımcıları da bu gereksinimi karşıladı (bkz . JEP368'deki 'Yeni kaçış dizileri' ). Böylece, JDK 14 için en son erken erişim derlemesi \ile bir satırın sonunda yeni satırdan kaçmak için bir iz kullanabilirsiniz :

public class Main {
    public static void main(String[] args) {
        String paragraph =
            """
            aaaa bbbb cccc \
            dddd eeee ffff \
            gggg hhhh iiii \
            """;
        System.out.println(paragraph);
    }
}

Baskılar:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14, ha? Girintilemenin birleşmesinin nasıl çalışacağını veya tüm beyaz boşlukların temiz olup olmadığını merak ediyorum?
alife

Ancak bu yine de, bu durumda satırsonlarını doğrudan kaldırabilecek kadar değerli olabilecek mevcut dize girişini değiştirmeyi gerektirir.
Naman

3
Hmm, öncelikle onlar dil değişiklikleri haklı o kadar önemli bir özellik olduğu gibi gömmek edebi metne mümkün olan varlık demek, artık kendi başlarına çıkış sıralarını alır ve ben merak zorunda ne avantajı koyarak bitti "aaaa bbbb cccc ", +"dddd eeee ffff "ve +"gggg hhhh iiii "her biri ayrı bir çizgide ...
Holger

@Holger Özellik 2'ye ayrılmıştır; metin blokları (diğer adıyla çok satırlı dizeler) ve ham dize değişmez değerleri (yani, tbd olan as-is dizesidir). Bu sadece birincisi. Diğer kaçışların \nhala metin bloklarında çalıştığını unutmayın.
Jorn Vernee

1
Ama şimdi elimizde readString, gömülü kaynakların kullanımı çok daha kolay. Asla tüm paragrafları kaynak koduna entegre etmek istemedim, sadece I / O şeyler can sıkıcıydı.
Holger

4

String.linesJava-11'den bu yana tanıtılanları şu şekilde kullanabilirsiniz :

String output = paragraph.lines().collect(Collectors.joining());

Ücretsiz ve buna değer olan şey için, iki farklı kod bloğunun JShell uygulamasından bir ekran görüntüsü:

resim açıklamasını buraya girin


3
… Aynı şeyi yapıyorString output = paragraph.replaceAll("[\n\r]", "");
Holger

Ve çözümlerin olmayan (izin verme JDK-14'ün modifikasyonu kadar \siçinde """blokta) bana ben aslında sert (örneğin paragraflar arasında olduğu gibi, vs.) dönüşünü istiyorsun hatları ile EOL-az hatları birbirine karıştırmak üzere izin
alife

1

Aslında, Java 13'te iyi bir cevap bulmak kolay değildir (belki de imkansızdır), ancak Jorn Vernee'nin cevabındaki endişeyi zarif bir şekilde ele aldığını düşünüyorum (Java 14'teki yeni kaçış dizileri kabul edilebilir bir çözüm sunuyor).

Listelenen birkaç kaygıyı genişletmek için:

  • Holger, "metin blokları" özelliğinin çok inandırıcı olmadığından bahsediyor. Yapay dize birleştirme yapan "çirkin" kod bir sürü gördüm, bu yüzden özelliği kesinlikle bir sorunu giderir düşünüyorum . Diğer taraftan, böyle bir özelliğin kötüye kullanım için çok fazla alan bıraktığını kabul etmeliyim ("Java koduna çok fazla metin koyalım, çünkü şimdi güzel yapabiliriz!" - bir sonraki noktaya bakın) ).
  • Asıl soru, bu özelliği hiç kullanmama konusunda tavsiyede bulunan ancak bu içeriği kaynak dosyalarına dışa aktaran "büyük paragraflardan" bahsediyor.
  • Netlik ve belirli yönlerin "okuyucu için açık olmadığı, bu yüzden açık olmayan bir anlamı olan bir sözdizimimiz var" hakkında. Bu kısmen doğrudur ve şu anda mevcut materyal çok geniş olmasa da biraz okuma ve deney yapmak gerekir. Bunu buldum: Programcı'nın Metin Blokları Kılavuzu , oldukça fazla örnek sunuyor. Ayrıca bazı örnekler yazdım, metin blokları olan burada: TextBlocks.java - umarım bu yardımcı olacaktır.

Moderatör için not: Bu cevabın potansiyel olarak kılavuzu ihlal ettiğini biliyorum (soruyu ele almıyorum ve diğer kullanıcıların yorumlarına cevap veriyorum), ancak hala devam etmekte olan konular için tartışma için yer olması gerektiğini düşünüyorum. ( metin bloklarının 'ikinci önizleme' modunda olduğunu unutmayalım ).


0

paragraph.replaceAll("\\n","") işi senin için yapmalı.


Intellij, satırın sonunda kaçış karakterlerini kullanmam nedeniyle bir tür çökme döngüsünde. Belki de en iyisi şu """ line line line """.replaceAll("\\n",""); anda doğrulanamıyor.
alife

Sanırım bu, çalışma zamanında ve derleme zamanında ele alınmayan (küçük) bir sorun var, ancak bu benim amacım için bir gereklilik değil.
alife

Bu çözüm aynı zamanda \sJDK-14 yeteneğine tam olarak ulaşamaz . Satır kesmeleri olmayan, ancak aralarında satır kesmeleri olan birkaç paragraf istersem ne olur?
alife
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.