Подтвердить что ты не робот

Как разбить String на некоторый разделитель, но не удаляя этот разделитель в Java?

Я столкнулся с проблемой расщепления String.

Я хочу разделить String на некоторый разделитель, но не теряя этот разделитель.

Когда мы используем метод somestring.split(String separator) в Java, он разбивает String, но удаляет разделительную часть из String. Я не хочу, чтобы это произошло.

Я хочу получить результат, как показано ниже:

String string1="Ram-sita-laxman";
String seperator="-";
string1.split(seperator);

Вывод:

[Ram, sita, laxman]

но я хочу получить результат, подобный приведенному ниже:

[Ram, -sita, -laxman]

Есть ли способ получить такой вывод?

4b9b3361

Ответ 1

string1.split("(?=-)");

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

Я хотел бы объяснить больше, но моя дочь хочет сыграть в чаепитие.:)

Изменить: Назад!

Чтобы объяснить это, я сначала покажу вам другую операцию split:

"Ram-sita-laxman".split("");

Это разделяет вашу строку на каждой строке нулевой длины. Между каждым символом существует строка с нулевой длиной. Следовательно, результат:

["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]

Теперь я изменяю свое регулярное выражение ("") только для соответствия строкам нулевой длины, если за ними следует тире.

"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]

В этом примере ?= означает "lookahead". В частности, это означает "положительный взгляд". Почему "позитивный"? Потому что вы также можете иметь отрицательный lookahead (?!), который будет разбиваться на каждую строку нулевой длины, которая не, а затем тире:

"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]

Вы также можете иметь положительный lookbehind (?<=), который будет разбиваться на каждую строку нулевой длины, которой предшествует тире:

"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]

Наконец, вы также можете иметь отрицательный lookbehind (?<!), который будет разбиваться на каждую строку нулевой длины, которая не, перед которой указывает тире:

"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]

Эти четыре выражения известны под общим названием "обратные выражения".

Бонус: объединение их

Я просто хотел показать пример, с которым я столкнулся недавно, который объединяет два вида поиска. Предположим, вы хотите разбить идентификатор CapitalCase на свои жетоны:

"MyAwesomeClass" => ["My", "Awesome", "Class"]

Вы можете выполнить это, используя это регулярное выражение:

"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");

Это разбивается на каждую строку нулевой длины, которой предшествует строчная буква ((?<=[a-z])), за которой следует буква верхнего регистра ((?=[A-Z])).

Этот метод также работает с идентификаторами camelCase.

Ответ 2

Это немного изворотливое, но вы можете ввести фиктивный разделитель, используя функцию replace. Я не знаю методов Java, но в С# это может быть что-то вроде:

string1.Replace("-", "#-").Split("#");

Конечно, вам нужно будет выбрать фиктивный разделитель, который не будет нигде в строке.

Ответ 3

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

Ответ 4

seperator="-";
String[] splitstrings = string1.split(seperator);
for(int i=1; i<splitstring.length;i++)
{
   splitstring[i] = seperator + splitstring[i];
}

то есть код, подходящий для ответа LadaRaider.

Ответ 5

Адам ударил ноготь по голове! Я использовал его ответ, чтобы выяснить, как вставить текст имени файла из браузера диалогового окна файла в текстовое поле с богатым текстом. Проблема, с которой я столкнулся, заключалась в добавлении новой строки в строку "\" в строке файла. Команда string.split разбивалась на\и удаляла ее. После использования комбинации кода Ада я смог создать новую строку после каждого\в имени файла.

Вот код, который я использовал:

OpenFileDialog fd = new OpenFileDialog();
        fd.Multiselect = true;
        fd.ShowDialog();

        foreach (string filename in fd.FileNames)
        {
            string currentfiles = uxFiles.Text;
            string value = "\r\n" + filename;

     //This line allows the Regex command to split after each \ in the filename. 

            string[] lines = Regex.Split(value, @"(?<=\\)");

            foreach (string line in lines)
            {
                uxFiles.Text = uxFiles.Text + line + "\r\n";
            }
        }

Наслаждайтесь!

Walrusking