Положить символ в строку Java для каждого N символов - PullRequest
22 голосов
/ 11 февраля 2009

У меня есть строка Java, которая имеет переменную длину.

Мне нужно поместить кусок "<br>" в строку, скажем, каждые 10 символов.

Например, это моя строка:

`this is my string which I need to modify...I love stackoverlow:)`

Как мне получить эту строку?:

`this is my<br> string wh<br>ich I nee<br>d to modif<br>y...I love<br> stackover<br>flow:)`

Спасибо

Ответы [ 9 ]

43 голосов
/ 11 февраля 2009

Попробуйте:

String s = // long string
s.replaceAll("(.{10})", "$1<br>");

РЕДАКТИРОВАТЬ: Выше работает ... большую часть времени. Я поиграл с этим и столкнулся с проблемой: поскольку он создает шаблон по умолчанию внутри, он останавливается на новых строках. чтобы обойти это, вы должны написать это по-другому.

public static String insert(String text, String insert, int period) {
    Pattern p = Pattern.compile("(.{" + period + "})", Pattern.DOTALL);
    Matcher m = p.matcher(text);
    return m.replaceAll("$1" + insert);
}

и проницательный читатель обнаружит еще одну проблему: вам нужно избегать специальных символов регулярного выражения (например, "$ 1") в тексте замены, или вы получите непредсказуемые результаты.

Мне также стало любопытно, и я сравнил эту версию с версией Джона. Это на порядок медленнее (1000 замен для файла 60 КБ заняли 4,5 секунды, а 400 мс его). Из 4,5 секунд только около 0,7 секунд фактически строили паттерн. Большая часть этого была на сопоставлении / замене, так что она даже не привела к такой оптимизации.

Обычно я предпочитаю менее многословные решения для вещей. В конце концов, больше кода = больше потенциальных ошибок. Но в этом случае я должен признать, что версия Джона - которая действительно является наивной реализацией (я имею в виду хороший способ ) - значительно лучше.

29 голосов
/ 11 февраля 2009

Что-то вроде:

public static String insertPeriodically(
    String text, String insert, int period)
{
    StringBuilder builder = new StringBuilder(
         text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    String prefix = "";
    while (index < text.length())
    {
        // Don't put the insert in the very first iteration.
        // This is easier than appending it *after* each substring
        builder.append(prefix);
        prefix = insert;
        builder.append(text.substring(index, 
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}
6 голосов
/ 02 марта 2018

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

s = s.replaceAll ("..", "$ 0"); Вы также можете обрезать результат, чтобы удалить лишнее пространство в конце.

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

s = s.replaceAll (".. (?! $)", "$ 0");

Например:

String s = "23423412342134"; s = s.replaceAll("....", "$0<br>"); System.out.println(s);

Выход: 2342<br>3412<br>3421<br>34

3 голосов
/ 22 июня 2016

Если вы не возражаете против зависимости от сторонней библиотеки и не против регулярных выражений :

import com.google.common.base.Joiner;

/**
 * Splits a string into N pieces separated by a delimiter.
 *
 * @param text The text to split.
 * @param delim The string to inject every N pieces.
 * @param period The number of pieces (N) to split the text.
 * @return The string split into pieces delimited by delim.
 */
public static String split( final String text, final String delim, final int period ) {
    final String[] split = text.split("(?<=\\G.{"+period+"})");
    return Joiner.on(delim).join(split);
}

Тогда:

split( "This is my string", "<br/>", 5 );  

Это не разделяет слова в пробелах, но, как уже было сказано, вопрос не требует переноса слов.

3 голосов
/ 11 мая 2009

Чтобы не отрубить слова ...

Попытка:

    int wrapLength = 10;
    String wrapString = new String();

    String remainString = "The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog";

    while(remainString.length()>wrapLength){
        int lastIndex = remainString.lastIndexOf(" ", wrapLength);
        wrapString = wrapString.concat(remainString.substring(0, lastIndex));
        wrapString = wrapString.concat("\n");

        remainString = remainString.substring(lastIndex+1, remainString.length());
    }

    System.out.println(wrapString); 
1 голос
/ 08 декабря 2017

Я протестировал это решение для граничных условий:

public String padded(String original, int interval, String separator) {
    String formatted = "";

    for(int i = 0; i < original.length(); i++) {
        if (i % interval == 0 && i > 0) {
            formatted += separator;
        }
        formatted += original.substring(i, i+1);
    }

    return formatted;
}

Позвонить по номеру:

padded("this is my string which I need to modify...I love stackoverflow:)", 10, "<br>");
1 голос
/ 11 февраля 2009
StringBuilder buf = new StringBuilder();

for (int i = 0; i < myString.length(); i += 10) {
    buf.append(myString.substring(i, i + 10);
    buf.append("\n");
}

Вы можете стать более эффективным, но я оставлю это в качестве упражнения для читателя.

0 голосов
/ 23 февраля 2018

Следующий метод принимает три параметра. Первый текст, который вы хотите изменить. Второй параметр - это текст, который вы хотите вставить каждые n символов. Третий интервал, в который вы хотите вставить текст в.

private String insertEveryNCharacters(String originalText, String textToInsert, int breakInterval) {
    String withBreaks = "";
    int textLength = originalText.length(); //initialize this here or in the start of the for in order to evaluate this once, not every loop
    for (int i = breakInterval , current = 0; i <= textLength || current < textLength; current = i, i += breakInterval ) {
        if(current != 0) {  //do not insert the text on the first loop
            withBreaks += textToInsert;
        }
        if(i <= textLength) { //double check that text is at least long enough to go to index i without out of bounds exception
            withBreaks += originalText.substring(current, i);
        } else { //text left is not longer than the break interval, so go simply from current to end.
            withBreaks += originalText.substring(current); //current to end (if text is not perfectly divisible by interval, it will still get included)
        }
    }
    return withBreaks;
}

Вы бы назвали этот метод следующим образом:

String splitText = insertEveryNCharacters("this is my string which I need to modify...I love stackoverlow:)", "<br>", 10);

Результат:

this is my<br> string wh<br>ich I need<br> to modify<br>...I love <br>stackoverl<br>ow:)

^ Это отличается от вашего примера, потому что у вас был набор с 9 символами вместо 10 из-за человеческой ошибки;)

0 голосов
/ 11 февраля 2009

Как насчет 1 способа разбить строку на каждые N символов:

public static String[] split(String source, int n)
{
    List<String> results = new ArrayList<String>();

    int start = 0;
    int end = 10;

    while(end < source.length)
    {
        results.add(source.substring(start, end);
        start = end;
        end += 10;
    }

    return results.toArray(new String[results.size()]);
}

Затем еще один способ вставить что-то после каждого фрагмента:

public static String insertAfterN(String source, int n, String toInsert)
{
    StringBuilder result = new StringBuilder();

    for(String piece : split(source, n))
    {
        result.append(piece);
        if(piece.length == n)
            result.append(toInsert);
    }

    return result.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...