Различие между Java и JavaScript

Функциональность разделения, по-видимому, отличается между Java и JavaScript.

Мне не нужно точно соответствовать определенным критериям регулярного выражения или использовать регулярное выражение на основе lookahead. Моя проблема заключается в том, что пустые совпадения возвращаются после окончательного соответствия разделенного регулярного выражения (которое представляет собой простой набор символов, а не выражение).

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

Java

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~")

/* results with an array of length 8 */ (java.lang.String[]) [, , , A, B, C, D, E]

Javascript

 "~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~".split("~#~")
 /* results with an array of length 11 */ ["", "", "", "A", "B", "C", "D", "E", "", "", ""]

Я действительно не могу положиться на это хорошее объяснение, поскольку я работаю с Java-приложением, и раскол вызывает у меня проблемы, я хочу получить тот же результат, что и в JavaScript. Как я могу это получить?

Ответ 1

Javadoc on split(String regex):

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

Javadoc on split(String regex, int limit):

Если n не является положительным, шаблон будет применяться столько раз, сколько возможно, и массив может иметь любую длину. Если n равно нулю, шаблон будет применяться столько раз, сколько возможно, массив может иметь любую длину, а конечные пустые строки будут отброшены.

Итак... split("~#~", -1) должен сделать трюк.

Ответ 2

Документация Java split() четко указывает, что конечные пустые строки НЕ будут включены.

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

но вы можете достичь этого

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~" , -1)

который является перегруженным методом

Ответ 3

Документация Java split() четко упоминает, что конечные пустые строки будут содержать НЕ.

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