String.split neden kaçmak için boru sınırlayıcıya ihtiyaç duyar?


140

Boru sınırlanmış değerleri olan her satırı olan bir dosyayı ayrıştırmaya çalışıyorum. Bölme yönteminde boru sınırlayıcıdan kaçmadığımda doğru çalışmadı, ancak boruyu aşağıdaki gibi çıkardıktan sonra doğru çalıştı.

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("\\|"); // note the escape "\\" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

Birisi split()yöntem için neden boru karakterinin kaçması gerektiğini açıklayabilir mi?


13
Aşağıdaki cevaplar "neden" yanıtını verdi, ancak sadece FYI, bir değişmez Dize ile eşleştirmeye çalışıyorsanız Pattern.quote'a da bakabilirsiniz . Bir alır Stringve Stringgirdiyle eşleşecek bir normal ifade döndürür (yani sizin için tüm çıkışları halleder).
yshavit

+1 içinPattern.quote
redDevil

Yanıtlar:


175

String.splitdüzenli ifade argümanı bekliyor. Çıkış karakteri |, "boş dize veya boş dize" anlamına gelen normal ifade olarak ayrıştırılır.


76

Çünkü bu parametrenin bölünecek sözdizimi normal bir ifade olduğu için '|' özel bir OR anlamı ve '\ |' gerçek bir '|' anlamına gelir yani "\\ |" dizesi '\ |' normal ifadesi anlamına gelir yani '|' karakteriyle tam olarak eşleşir.


1
Bu açıklama için teşekkürler. Neredeyse her zaman çifte kaçışı kullanmayı unutuyorum. Şimdi neden böyle olduğunu bildiğime göre, bundan sonra hatırlamama kesinlikle yardımcı olacak.
sufinawaz

Dize satırının değerinde bazı Boru karakterleri varsa ne olur? Kaçan boruyu bölmeden nasıl bölünürsünüz \ | ?
AlexandreJ

@AlexandreJ nasıl bir çizgi bölmek soruyorsunuz görünüyor böyle: Some|Delimited|Text|With|An\|Embedded|Pipe|Chariçine ("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")? Bölme işlevi bu şekilde kaçmayı desteklemez, ancak grubun arkasına sıfır genişlikli bir negatif iddia gibi, bu durumda işe yarayacak normal bir ifade oluşturabilirsiniz: (?<!\\)\|hangisiline.split("(?<!\\\\)\\|");
dlamblin

6

Bunu basitçe yapabilirsiniz:

String[] arrayString = yourString.split("\\|");

Eğer doğru formülü regex "yourString.split (" \\ | ")" kullanmak için \ kaçmak zorunda.
mautrok
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.