Split Java String by New Line

Próbuję podzielić tekst na JTextArea używając wyrażenia regularnego, aby podzielić Łańcuch przez \n jednak to nie działa i próbowałem również przez \r\n|\r|n i wiele innych kombinacji wyrażeń regularnych. Kod:

public void insertUpdate(DocumentEvent e) {
    String split[], docStr = null;
    Document textAreaDoc = (Document)e.getDocument();

    try {
        docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
    } catch (BadLocationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    split = docStr.split("\\n");
}
Author: Can Berk Güder, 2009-01-18

17 answers

To powinno cię pokryć:

String lines[] = string.split("\\r?\\n");

Są tylko dwie nowe linie (UNIX i Windows), o które musisz się martwić.

 625
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 14:44:08

Jeśli nie chcesz pustych linii:

String.split("[\\r\\n]+")
 110
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 10:21:56

split metoda wykorzystuje regex (wyrażenia regularne). Ponieważ Java 8 regex obsługuje \R, które reprezentuje (z dokumentację klasy wzorca):

Linebreak matcher
\R Dowolna Sekwencja linebreak Unicode, jest równoważna \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Więc możemy użyć go do dopasowania:

Jak widzisz \r\n jest umieszczony na początku regex, co zapewnia, że regex spróbuje najpierw dopasować tę parę , i tylko jeśli się nie powiedzie, spróbuje aby dopasować separatory linii z pojedynczym znakiem.


Więc jeśli chcesz podzielić separator on line Użyj split("\\R").

Jeśli nie chcesz usuwać z tablicy wynikowej kończących się pustych łańcuchów "" użyj split(regex, limit) z ujemnym parametrem limit, takim jak split("\\R", -1).

Jeśli chcesz traktować jedną lub więcej pustych linii jako pojedynczy ogranicznik, użyj split("\\R+").

 77
Author: Pshemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:22
String.split(System.getProperty("line.separator"));

To powinno być niezależne od systemu

 41
Author: Shervin Asgari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-04 11:10:54

Nie musisz podwajać znaków escape w grupach znaków.

Dla wszystkich niepustych linii użyj:

String.split("[\r\n]+")
 11
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-17 12:12:44

Może to zadziała:

Usuń podwójne ukośniki z parametru metody split:

split = docStr.split("\n");
 7
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 19:27:11

Do zachowania pustych linii przed zgnieceniem użyj:

String lines[] = String.split("\\r?\\n", -1);
 4
Author: sevenforce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 20:06:08

Wszystkie odpowiedzi podane tutaj w rzeczywistości nie respektują Java definicji nowych linii, jak podano np. w BufferedReader#readline. Java akceptuje \n, \r i \r\n jako nowa linia. Niektóre odpowiedzi pasują do wielu pustych linii lub zniekształconych plików. E..g. <sometext>\n\r\n<someothertext> Podczas używania [\r\n]+ spowoduje powstanie dwóch linii.

String lines[] = string.split("(\r\n|\r|\n)", -1);

Natomiast powyższa odpowiedź ma następujące właściwości:

  • jest zgodny z definicją Javas nowej linii, np. BufferedReader używa it
  • nie pasuje do wielu nowych linii
  • nie usuwa końcowych pustych linii
 4
Author: Till Schäfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 14:18:29

Powyższy kod nie robi właściwie nic widocznego - po prostu calcualtes następnie zrzuca obliczenia. Czy to kod, którego użyłeś, czy tylko przykład na to pytanie?

Spróbuj zrobić textAreaDoc.insertString (int, String, AttributeSet) na końcu?

 3
Author: Chii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-18 10:23:01

Wprowadzono nową metodę lines do klasy String w java-11 , która zwraca Stream<String>

Zwraca strumień podłańcuchów wyciągniętych z tego łańcucha podzielonego na partycje przez Terminatorów liniowych.

Terminatorami liniowymi są linie "\n " (U + 000A) , return " \R "(U+000d) i powrót karetki, po którym następuje natychmiast linia feed " \r \ n "(U+000d u+000A).

Oto kilka przykładów:

jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
 ipusm
 sit

jshell> "lorem \n ipusm \r  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

jshell> "lorem \n ipusm \r\n  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

String # lines()

 3
Author: Anton Balaniuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 09:39:43

Jeśli z jakiegoś powodu nie chcesz używać String.split (na przykład z powodu wyrażeń regularnych), A chcesz używać programowania funkcyjnego w Javie 8 lub nowszej:

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());
 2
Author: Danilo Piazzalunga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 19:51:32

String lines[] =String.split( System.lineSeparator())

 1
Author: husayt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 16:30:59

Po nieudanych próbach na podstawie wszystkich podanych rozwiązań. Zamieniam \n jakimś specjalnym słowem, a następnie dzielę. Dla mnie po wykonaniu triku:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
Nie mogłem powtórzyć przykładu podanego w pytaniu. Ale myślę, że tę logikę można zastosować.
 1
Author: kravi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 16:23:35

Jako alternatywa dla poprzednich odpowiedzi, API Splitter guava może być używane, jeśli do wynikowych linii mają być zastosowane inne operacje, takie jak przycinanie linii lub filtrowanie pustych linii:

import com.google.common.base.Splitter;

Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

Zwróć uwagę, że wynik jest Iterable, a nie tablicą.

 1
Author: Thomas Naskali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 09:19:51
  • Spróbuj tej nadziei, że to było pomocne dla ciebie

 String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();

try {
    docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

split = docStr.split("\n");
 0
Author: Vishal Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-14 12:21:55

Istnieją trzy różne konwencje (można powiedzieć, że są to de facto standardy) do ustawiania i wyświetlania podziału linii:

  • carriage return + line feed
  • line feed
  • carriage return

W niektórych edytorach tekstu istnieje możliwość wymiany jednego na drugi:

Notepad++

Najprostszą rzeczą jest normalizacja do line feed, a następnie podział.

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);
 0
Author: Paul Vargas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 04:15:32
package in.javadomain;

public class JavaSplit {

    public static void main(String[] args) {
        String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
        System.out.println("Before split:\n");
        System.out.println(input);

        String[] inputSplitNewLine = input.split("\\n");
        System.out.println("\n After split:\n");
        for(int i=0; i<inputSplitNewLine.length; i++){
            System.out.println(inputSplitNewLine[i]);
        }
    }

}
 -2
Author: Naveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-22 20:39:23