Для заданной строки вставьте новый символ новой строки на 50-й позиции и исключите целые слова. - PullRequest
0 голосов
/ 02 мая 2018
String str = "Hello how are you today music fine.This is a new line"
String parsedStr = str.replace("(.{50})","$1\n");

Мне нужно, чтобы новая строка была

Hello how are you today music fine.This is a new 
line

Но я получаю вот так

 Hello how are you today music fine.This is a new l
 ine

Я наткнулся на границу слова (\ b). Пробовал, но не работает с моим делом.

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Вполне может быть простое решение вашей проблемы. Видя, как OP предоставил нам только одну примерную строку, неизвестно, есть ли особые случаи , но следующее работает для их примерной строки.

Примечание: Я отправляю регулярное выражение raw . Вам нужно будет экранировать все необходимые символы (обратную косую черту) в Java.

Вариант 1

Возможно, вы даже сможете использовать ^(.{0,50}) (в конце есть пробел) вместо \b.

Смотрите здесь регулярное выражение

^(.{0,50}\b)
  • ^ Утверждение позиции в начале строки
  • (.{0,50}\b) Захватывать любой символ до 50 раз, утверждая, что конечная позиция соответствует границе слова \b в группу захвата 1

Замена: $1\n

Результат:

Hello how are you today music fine.This is a new 
line

Вариант 2

Этот метод использует Вариант 1 в качестве основы, но добавляет логику для строки, которая может добавить \n перед пунктуацией (что может быть непредвиденным результатом). В этих случаях вы можете использовать следующее.

Смотрите здесь регулярное выражение

^(.{0,50}\b(?!\p{P}|$))
  • Та же логика, что и в варианте 1, но гарантирует, что \b не соответствует \p{p} (знак пунктуации) или концу строки.

Результат (второй вариант будет иметь \n до . с использованием регулярного выражения Варианта 1):

Hello how are you today music fine.This is a new 
line
This line contains 50 characters to show dot 
issue.Some other string here
0 голосов
/ 02 мая 2018

Это делает буквально , что вы просили, и ничего более. Однако, если вы действительно хотите реализовать перенос слов, это не очень хороший подход.

String str = "Hello how are you today music fine.This is a new line";
String parsedStr = str.replaceFirst("^(.*?)\\s*((\\S(?!\\s))*(?<=.{50}).*$)",
        "$1"+System.lineSeparator()+"$2");
String [] pieces = parsedStr.split(System.lineSeparator());
for(String piece : pieces ) {
    System.out.format("length %2d: \"%s\"%n", piece.length(), piece);
}

Выход:

длина 48: «Привет, как дела сегодня, музыка прекрасна. Это новая»

длина 4: «линия»

Пояснение:

  • ^ = начало строки (начало группы 1)
  • .*? = неохотно сопоставляют любое количество символов (конечная группа 1)
  • \s* = поглотить все пробелы, где будет разбиваться строка (начало группы 2)
  • \S* = соответствует любому количеству непробельных символов ...
  • (?!\\s) = НЕ сопровождается пробелами, иначе мы упустили бы шанс разделения точно на 50
  • (?<=.{50}) = позитивный просмотр ровно 50 символов
  • .*$ = включает все оставшиеся символы в строке (конечная группа 2)

Более простой вариант:

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

String parsedStr = str.replaceFirst("^(.{0,50})\\s+",
        "$1"+System.lineSeparator());

(кредиты ctwheels за аналогичное предложение)

Единственное отличие состоит в том, что этот может закончиться дополнительным пробелом в конце строки 1, если до разделения было несколько пробелов. Но это не плохо.

0 голосов
/ 02 мая 2018

Составьте выражение регулярного выражения .{1,N} с количеством символов, которое нужно использовать в строке.
Как и для 50, это будет .{1,50}.

Сжатый

Найти: (?:(?:(?>(.{1,50})(?:(?<=[^\S\r\n])[^\S\r\n]?|(?<=[,.;:!/?])[^\S\r\n]?|(?=\r?\n|[-#%&*@_])|[^\S\r\n]))|(.{1,50}))(?:\r?\n)?|(?:\r?\n))

Заменить: $1$2\r\n

Чтение

 (?:
      # -- Words/Characters 
      (?:
           (?>                           # Atomic Group - Match words with valid breaks
                ( .{1,50} )                   # (1), 1-N characters
                                              #  Followed by one of 4 prioritized, non-linebreak whitespace
                (?:                           #  break types:
                     (?<= [^\S\r\n] )              # 1. - Behind a non-linebreak whitespace
                     [^\S\r\n]?                    #      ( optionally accept an extra non-linebreak whitespace )
                  |  (?<= [,.;:!/?] )              # 2. - Behind sepcial punctuation breaks
                     [^\S\r\n]?                    #      ( optionally accept an extra non-linebreak whitespace )
                  |  (?=                           # 3. - Ahead a linebreak or special punctuation breaks
                          \r? \n 
                       |  [-#%&*@_] 
                     )
                  |  [^\S\r\n]                     # 4. - Accept an extra non-linebreak whitespace
                )
           )                             # End atomic group
        |  
           ( .{1,50} )                   # (2), No valid word breaks, just break on the N'th character
      )
      (?: \r? \n )?                 # Optional linebreak after Words/Characters
   |  
      # -- Or, Linebreak
      (?: \r? \n )                  # Stand alone linebreak
 )
0 голосов
/ 02 мая 2018

Попробуйте этот код:

String str = "Hello how are you today music fine.This is a new line"
int index = 50;
while(str.getCharAt(index) != ' ') 
{
    index--;
}

String parsedStr = str.replace("(.{index})","$1\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...