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

Разделить строку, на каждой n-й позиции

Я использую это регулярное выражение для разбиения строки на каждую третью позицию:

String []thisCombo2 = thisCombo.split("(?<=\\G...)");

где 3 точки после G указывают каждую n-ю позицию для разделения. В этом случае 3 точки указывают каждые 3 позиции. Пример:

Input: String st = "123124125134135145234235245"
Output: 123 124 125 134 135 145 234 235 245.

Мой вопрос в том, как я могу позволить пользователю управлять количеством позиций, где должна быть разделена строка? Другими словами, как мне сделать эти 3 точки, n точек, управляемых пользователем?

4b9b3361

Ответ 1

Для большого улучшения производительности альтернативой будет использование substring() в цикле:

public String[] splitStringEvery(String s, int interval) {
    int arrayLength = (int) Math.ceil(((s.length() / (double)interval)));
    String[] result = new String[arrayLength];

    int j = 0;
    int lastIndex = result.length - 1;
    for (int i = 0; i < lastIndex; i++) {
        result[i] = s.substring(j, j + interval);
        j += interval;
    } //Add the last bit
    result[lastIndex] = s.substring(j);

    return result;
}

Пример:

Input:  String st = "1231241251341351452342352456"
Output: 123 124 125 134 135 145 234 235 245 6.

Это не так коротко, как решение stevevls, но оно более эффективно (см. ниже), и я думаю, что было бы легче в зависимости от вашей ситуации, конечно, в будущем.


Тесты производительности (Java 7u45)

2000 символы длинной строки - интервал 3.

split("(?<=\\G.{" + count + "})") производительность (в миллисекундах):

7, 7, 5, 5, 4, 3, 3, 2, 2, 2

splitStringEvery() (substring()) производительность (в миллисекундах):

2, 0, 0, 0, 0, 1, 0, 1, 0, 0

2 000 000 символов длинная строка - интервал 3.

split() производительность (в милисекундах):

207, 95, 376, 87, 97, 83, 83, 82, 81, 83

splitStringEvery() производительность (в миллисекундах):

44, 20, 13, 24, 13, 26, 12, 38, 12, 13

2 000 000 символов длинная строка - интервал 30.

split() производительность (в милисекундах):

103, 61, 41, 55, 43, 44, 49, 47, 47, 45

splitStringEvery() производительность (в миллисекундах):

7, 7, 2, 5, 1, 3, 4, 4, 2, 1

Вывод:

Метод splitStringEvery() намного быстрее (даже после изменений в Java 7u6) и он увеличивается, когда интервалы становятся выше.

Готовый тестовый код:

pastebin.com/QMPgLbG9

Ответ 2

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

String []thisCombo2 = thisCombo.split("(?<=\\G.{" + count + "})");

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

Ответ 3

Используя Google Guava, вы можете использовать Splitter.fixedLength()

Возвращает разделитель, который делит строки на куски заданной длины

Splitter.fixedLength(2).split("abcde");
// returns an iterable containing ["ab", "cd", "e"].

Ответ 4

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

public String getRegex(int splitLength)
{
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < splitLength; i++)
        builder.append(".");

    return "(?<=\\G" + builder.toString() +")";
}

Ответ 5

private String[] StringSpliter(String OriginalString) {
    String newString = "";
    for (String s: OriginalString.split("(?<=\\G.{"nth position"})")) { 
        if(s.length()<3)
            newString += s +"/";
        else
            newString += StringSpliter(s) ;
    }
    return newString.split("/");
}