Java: как разделить текст на любые возможные символы новой строки / строки (дубликаты)

Вам нужно преобразовать каждый строковый ключ в объект. Используя следующую функцию, вы можете получить желаемый результат.

 function convertIntoJSON(obj) {

                var o = {}, j, d;
                for (var m in obj) {
                    d = m.split(".");
                var startOfObj = o;
                for (j = 0; j < d.length  ; j += 1) {

                    if (j == d.length - 1) {
                        startOfObj[d[j]] = obj[m];
                    }
                    else {
                        startOfObj[d[j]] = startOfObj[d[j]] || {};
                        startOfObj = startOfObj[d[j]];
                    }
                }
            }
            return o;
        }

Теперь вызовите эту функцию

 var aa = {
                'ab.cd.e': 'foo',
                'ab.cd.f': 'bar',
                    'ab.g': 'foo2'
                };
   var desiredObj =  convertIntoJSON(aa);
323
задан Can Berk Güder 29 April 2009 в 10:27
поделиться

17 ответов

Это должно охватывать вас:

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

Есть только две новые строки (UNIX и Windows), о которых вам нужно беспокоиться.

614
ответ дан Buhake Sindi 24 August 2018 в 06:22
поделиться
  • 1
    Документу JTextArea ДОЛЖНО использовать только «\n»; его Представления полностью игнорируют '\r'. Но если вы собираетесь искать более одного типа разделителя, вы можете также искать все три: «\r?\n |\r». – Alan Moore 18 January 2009 в 19:02
  • 2
    Mac 9 использует\r. OSX 10 использует\n – Raekye 6 May 2013 в 06:25
  • 3
    $ {fn: length (fn: split (data, '\\r? \\n'))} не работает в jstl – user 17 June 2014 в 16:48
  • 4
    Не так ли: 'String [] lines = String.split ("\\r? \\n");' ? – FeinesFabi 30 October 2014 в 11:45
  • 5
    @antak yes, split по умолчанию удаляет завершающие пустые строки, если они производят результат split. Чтобы отключить этот механизм, вам нужно использовать перегруженную версию split(regex, limit) с отрицательным пределом, например text.split("\\r?\\n", -1). Дополнительная информация: Разделение строки Java удалено пустым значением – Pshemo 19 July 2016 в 13:08

В был введен новый метод lines, который возвращает Stream<String>

Возвращает поток подстрок, извлеченный из этой строки, разбитой на разделители строк.

Определяемые терминаторы строк - это строка «\n» (U + 000A), возврат каретки «\r» (U + 000D) и возврат каретки, line-канал "\r\n" (U + 000D U + 000A).

Вот несколько примеров:

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

Строковые # строки ()

1
ответ дан Anton Balaniuc 24 August 2018 в 06:22
поделиться
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
ответ дан bobble bubble 24 August 2018 в 06:22
поделиться
  • 1
    Это бледнеет по сравнению с другими ответами, которые являются более объяснительными и менее тяжелыми для кода. Не могли бы вы объяснить, что именно вы выполняете с помощью этого кода, и почему он сделает подходящий ответ? – Makoto 19 May 2014 в 01:24
  • 2
    Это не имеет никакого отношения к разбиению файла на строки. Попробуйте удалить свой ответ. – Martin 11 December 2014 в 09:47

Вышеприведенный код фактически ничего не видит - он просто вычисляет, а затем выдает расчет. Это код, который вы использовали, или просто пример для этого вопроса?

попытаться выполнить textAreaDoc.insertString (int, String, AttributeSet) в конце?

3
ответ дан Chii 24 August 2018 в 06:22
поделиться
  • 1
    insertUpdate () - метод DocumentListener. Предполагая, что OP использует его правильно, попытка изменить документ из метода слушателя приведет к возникновению исключения. Но вы правы: код в этом вопросе на самом деле ничего не делает. – Alan Moore 18 January 2009 в 18:55
  • 2
    Просто пример. – dr.manhattan 18 January 2009 в 20:50

split метод использует регулярное выражение (регулярное выражение). Так как Java 8 regex поддерживает \R, который представляет (из документации класса Шаблона ):

Соединитель строк\r & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; Любая последовательность строк Unicode, эквивалентна \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

. Поэтому мы можем использовать ее для соответствия:

Как вы видите \r\n помещается в начало регулярного выражения, что гарантирует, что регулярное выражение будет пытаться сначала сопоставить эту пару , и только если он не работает, он попытается сопоставить разделители строк одиночного символа .


Итак, если вы хотите используйте разделитель разделителей на линии split("\\R").

Если вы не хотите удалять из результирующего массива конечные пустые строки "" , используйте split(regex, limit) с отрицательным параметром limit, например split("\\R", -1).

Если вы хотите рассматривать одну или несколько оставшихся пустых строк в качестве одного разделителя, используйте split("\\R+").

76
ответ дан Community 24 August 2018 в 06:22
поделиться

Если по какой-то причине вы не хотите использовать String.split (например, из-за регулярных выражений ), и вы хотите использовать функциональное программирование на Java 8 или новее:

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());
2
ответ дан Danilo Piazzalunga 24 August 2018 в 06:22
поделиться
  • 1
    Я знаю, что это может быть проблемой переполнения. – Danilo Piazzalunga 7 March 2018 в 20:52
  • 2
    Или String[] lines = new BufferedReader(...).lines().toArray(String[]::new); для массива вместо списка. Самое приятное в этом решении заключается в том, что BufferedReader знает обо всех типах терминаторов, поэтому он может обрабатывать текст во всех форматах. (Большинство распространенных решений на основе регулярных выражений здесь не подходят). – Ted Hopp 25 April 2018 в 03:48

Если вы не хотите пустые строки:

String.split("[\\r\\n]+")
110
ответ дан Gumbo 24 August 2018 в 06:22
поделиться

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

1
ответ дан husayt 24 August 2018 в 06:22
поделиться

После неудачных попыток на основе всех данных решений. Я заменяю \n некоторым специальным словом, а затем разделяю. Для меня следующий трюк:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

Я не смог воспроизвести пример, указанный в вопросе. Но, я думаю, эта логика может быть применена.

1
ответ дан kravi 24 August 2018 в 06:22
поделиться

Возможно, это сработает:

Удалите двойные обратные косые черты из параметра метода split:

split = docStr.split("\n");
7
ответ дан Michael 24 August 2018 в 06:22
поделиться
  • 1
    Плохая идея - вам нужна обратная косая черта для побега ... – Yuval Adam 18 January 2009 в 20:39
  • 2
    На самом деле, нет. Когда вы пишете регулярное выражение в форме литерала Java String, вы можете использовать & quot;\n & quot; передать компилятору регулярного выражения символ перевода строки или "\\n" передать ему escape-последовательность для перевода строки. То же самое касается всех остальных пробелов, кроме \ v, которые не поддерживаются в литералах Java. – Alan Moore 18 January 2009 в 21:55
  • 3
    @Yuval. Извините, что это неправильно, вам это совсем не нужно. «Обратные косые черты, экраны и цитаты». [Д0] docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/… – giulio 6 December 2011 в 00:10

Существует три различных соглашения (можно сказать, что они являются стандартами de facto ) для установки и отображения разрыва строки:

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

В некоторых текстовых редакторах можно обменять один на другой:

Notepad++ [/g1]

Самое простое - нормализовать line feed, а затем расколоть

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);
0
ответ дан Paul Vargas 24 August 2018 в 06:22
поделиться

Для сохранения пустых строк от раздавливания используйте:

String lines[] = String.split("\\r?\\n", -1);
4
ответ дан sevenforce 24 August 2018 в 06:22
поделиться
String.split(System.getProperty("line.separator"));

Это должно быть независимым от системы

41
ответ дан Shervin Asgari 24 August 2018 в 06:22
поделиться
  • 1
    Это интересная идея, но вы должны позаботиться о том, чтобы текст фактически использовал разделитель строк системы. У меня много много текстовых файлов в unix (например, XML), который использует «Windows». разделители и немало под Windows, которые используют разделители unix. – Maarten Bodewes 31 July 2012 в 00:37
  • 2
    Файлы, созданные в ОС Windows и перенесенные в ОС Unix, по-прежнему будут содержать\r\n seperators. Я думаю, что лучше играть в безопасное место и брать с собой обособленных отрядов. – bvdb 18 July 2014 в 12:44
  • 3
    Это очень проблематичный подход! Файл может не происходить из системы, выполняющей код. Я решительно отвергаю такие «независимые от системы». которые фактически зависят от конкретной системы, системы времени выполнения. – Martin 11 December 2014 в 09:38
  • 4
    @Shervin Это никогда не лучший способ сделать это. Это на самом деле очень плохая практика. Рассмотрим другой программист, вызывающий System.setProperty (& quot; line.separator & quot ;, & quot; у вас нет точки & quot;); Ваш код сломан. Его можно даже назвать так же зависимостью, о которой вы не знаете. – Martin 16 December 2014 в 14:34
  • 5
    Не работает в Windows – BullyWiiPlaza 3 April 2015 в 22:05

Вам не нужно удваивать escape-символы в группах символов.

Для всех непустых строк используйте:

String.split("[\r\n]+")
11
ответ дан sth 24 August 2018 в 06:22
поделиться
  • 1
    Да, да. Если они нуждаются в двойном экранировании в любом месте, они нуждаются в нем повсюду. Пробелы бегут, как \r и \n могут иметь одну или две обратные слэши; они работают в любом случае. – Alan Moore 6 June 2016 в 19:09
  • 2
    Двойная обратная косая черта '\\' в коде становится символом '\' и затем передается в механизм RegEx, поэтому "[\\r\\n]" в коде становится [\r\n] в памяти, и RegEx будет обрабатывать это. Я не знаю, как именно Java обрабатывает RegEx, но хорошей практикой является передача «чистого». ASCII-строковый шаблон для механизма RegEx и позволить ему обрабатывать, а не передавать двоичные символы. "[\r\n]" становится (шестнадцатеричным) 0D0A в памяти, и один движок RegEx может принять его, а другой задохнется. Таким образом, суть в том, что даже если Java-дизайн RegEx не нуждается в них, держите двойные слэши для совместимости – nurchi 15 September 2016 в 17:31

В качестве альтернативы предыдущим ответам API Splitter guava может использоваться, если к результирующим строкам будут применяться другие операции, такие как линии обрезки или фильтрация пустых строк:

import com.google.common.base.Splitter;

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

Примечание. что результатом является Iterable, а не массив.

1
ответ дан Thomas Naskali 24 August 2018 в 06:22
поделиться

Все приведенные здесь ответы фактически не соответствуют определению Javas новых строк, как указано в BufferedReader # Readline. Java принимает \n, \r и \r\n в качестве новой строки. Некоторые ответы соответствуют нескольким пустым строкам или искаженным файлам. Например. <sometext>\n\r\n<someothertext> при использовании [\r\n]+ приведет к двум строкам.

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

Напротив, ответ выше имеет следующие свойства:

  • он соответствует определению Javas новой строки, такой как, например, BufferedReader использует его
  • , он не соответствует нескольким новым строкам
  • , он не удаляет завершающие пустые строки
4
ответ дан Till Schäfer 24 August 2018 в 06:22
поделиться
  • попробуйте эту надежду, это было полезно для вас

 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
ответ дан Vishal Yadav 24 August 2018 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: