Вам нужно преобразовать каждый строковый ключ в объект. Используя следующую функцию, вы можете получить желаемый результат.
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);
Это должно охватывать вас:
String lines[] = string.split("\\r?\\n");
Есть только две новые строки (UNIX и Windows), о которых вам нужно беспокоиться.
В java-11 был введен новый метод lines
, который возвращает Stream<String>
Возвращает поток подстрок, извлеченный из этой строки, разбитой на разделители строк.
Определяемые терминаторы строк - это строка «\n» (U + 000A), возврат каретки «\r» (U + 000D) и возврат каретки, line-канал "\r\n" (U + 000D U + 000A).
blockquote>Вот несколько примеров:
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
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]);
}
}
}
Вышеприведенный код фактически ничего не видит - он просто вычисляет, а затем выдает расчет. Это код, который вы использовали, или просто пример для этого вопроса?
попытаться выполнить textAreaDoc.insertString (int, String, AttributeSet) в конце?
split
метод использует регулярное выражение (регулярное выражение). Так как Java 8 regex поддерживает \R
, который представляет (из документации класса Шаблона ):
Соединитель строк\r & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; Любая последовательность строк Unicode, эквивалентна
blockquote>\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
. Поэтому мы можем использовать ее для соответствия:
\u000D\000A
- >\r\n
пара- \ u000A -> строка (
\n
)- \ u000B -> строка табуляции (НЕ путайте с таблицей символов
\t
, которая является\u0009
)- \ u000C -> feed feed (
\f
)- \ u000D -> возврат каретки (
\r
)- \ u0085 -> следующая строка (NEL)
- \ u2028 -> разделитель строк
- \ u2029 -> разделитель абзацев
Как вы видите
\r\n
помещается в начало регулярного выражения, что гарантирует, что регулярное выражение будет пытаться сначала сопоставить эту пару , и только если он не работает, он попытается сопоставить разделители строк одиночного символа .
Итак, если вы хотите используйте разделитель разделителей на линии
split("\\R")
.Если вы не хотите удалять из результирующего массива конечные пустые строки
""
, используйтеsplit(regex, limit)
с отрицательным параметромlimit
, напримерsplit("\\R", -1)
.Если вы хотите рассматривать одну или несколько оставшихся пустых строк в качестве одного разделителя, используйте
split("\\R+")
.
Если по какой-то причине вы не хотите использовать String.split
(например, из-за регулярных выражений ), и вы хотите использовать функциональное программирование на Java 8 или новее:
List<String> lines = new BufferedReader(new StringReader(string))
.lines()
.collect(Collectors.toList());
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
для массива вместо списка. Самое приятное в этом решении заключается в том, что BufferedReader
знает обо всех типах терминаторов, поэтому он может обрабатывать текст во всех форматах. (Большинство распространенных решений на основе регулярных выражений здесь не подходят).
– Ted Hopp
25 April 2018 в 03:48
Если вы не хотите пустые строки:
String.split("[\\r\\n]+")
String lines[] =String.split( System.lineSeparator())
После неудачных попыток на основе всех данных решений. Я заменяю \n
некоторым специальным словом, а затем разделяю. Для меня следующий трюк:
article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
Я не смог воспроизвести пример, указанный в вопросе. Но, я думаю, эта логика может быть применена.
Возможно, это сработает:
Удалите двойные обратные косые черты из параметра метода split:
split = docStr.split("\n");
Существует три различных соглашения (можно сказать, что они являются стандартами de facto ) для установки и отображения разрыва строки:
carriage return
+ line feed
line feed
carriage return
В некоторых текстовых редакторах можно обменять один на другой:
[/g1]
Самое простое - нормализовать line feed
, а затем расколоть
final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);
Для сохранения пустых строк от раздавливания используйте:
String lines[] = String.split("\\r?\\n", -1);
String.split(System.getProperty("line.separator"));
Это должно быть независимым от системы
Вам не нужно удваивать escape-символы в группах символов.
Для всех непустых строк используйте:
String.split("[\r\n]+")
\r
и \n
могут иметь одну или две обратные слэши; они работают в любом случае.
– Alan Moore
6 June 2016 в 19:09
'\\'
в коде становится символом '\'
и затем передается в механизм 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
, а не массив.
Все приведенные здесь ответы фактически не соответствуют определению Javas новых строк, как указано в BufferedReader # Readline. Java принимает \n
, \r
и \r\n
в качестве новой строки. Некоторые ответы соответствуют нескольким пустым строкам или искаженным файлам. Например. <sometext>\n\r\n<someothertext>
при использовании [\r\n]+
приведет к двум строкам.
String lines[] = string.split("(\r\n|\r|\n)", -1);
Напротив, ответ выше имеет следующие свойства:
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");
split
по умолчанию удаляет завершающие пустые строки, если они производят результат split. Чтобы отключить этот механизм, вам нужно использовать перегруженную версиюsplit(regex, limit)
с отрицательным пределом, напримерtext.split("\\r?\\n", -1)
. Дополнительная информация: Разделение строки Java удалено пустым значением – Pshemo 19 July 2016 в 13:08