2016-05-04 8 views
6

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

Проблема в том, что количество символов 13 не сбрасывается после предыдущего выбранного пробела. Итак, после первых 13 символов регулярное выражение выбирает каждое пустое пространство.

Я использую следующее регулярное выражение с positive look-behind из 13 символов:

(?<=.{13}) 

(есть пробелы в конце)

Вы можете проверить регулярное выражение here и следующий код:

import java.util.ArrayList; 
public class HelloWorld{ 

    public static void main(String []args){ 
     String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters"; 

     for (String string : str.split("(?<=.{13}) ")) { 
      System.out.println(string); 
     } 
    } 
} 

выходной сигнал этого кода выглядит следующим образом:

Это тест.

приложение
должны
перерыв
это
строка
в
подстроки
на
непечатаемых
после
символов

Но это должно быть:

Это тест.
приложение должна
перерыв этой строка
в подстроках на
непечатаемых после
13 символов

ответ

5

Вы можете фактически использовать ленивый ограничивающий квантор к матчу линии, а затем заменить $0\n:

.{13,}?[ ] 

См. regex demo

IDEONE demo:

String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters"; 
System.out.println(str.replaceAll(".{13,}?[ ]", "$0\n")); 

Обратите внимание, что соответствует шаблону:

  • .{13,}? - любой символ, который не является новой строки (если вам нужно, чтобы соответствовать любому символу, используйте модификатор DOTALL, хотя я сомневаюсь, вам нужно это в текущем сценарии), по крайней мере 13 раз, и он может соответствовать более символам, но до первого найденного пространства
  • [ ] - буквальное пространство (класс символов i s, но он помогает визуализировать шаблон).

Образец замены - "$0\n" - повторно вставляет все согласованное значение (оно сохраняется в группе 0) и добавляет после него новую строку.

+0

О, спасибо. Я не думал о том, чтобы сопоставить строки и использовать соответствующие группы, подобные этому. Я всегда буду бороться с соответствующими группами, когда я хочу их выбрать. Я удалил свой предыдущий комментарий, потому что я слишком быстро прочитал ваш ответ. – Seblor

+0

Хорошо, я думаю, вы не ожидали, что все значение соответствия может быть повторно привязано к '$ 0' в шаблоне замены. –

+0

Точно. Обычно я использую регулярное выражение только для сопоставления почтовых адресов, чисел и т. Д. (А не с Java). – Seblor

3

Вы можете просто сопоставить и захватить 13 символов перед пробелами вместо разделения.

Java код:

Pattern p = Pattern.compile("(.{13}) +"); 
Matcher m = p.matcher(text); 

List<String> matches = new ArrayList<>(); 
while(m.find()) { 
    matches.add(m.group(1)); 
} 

Он будет производить:

This is a test. 
The app should 
break this string 
in substring on 
whitespaces after 
13 characters 

RegEx Demo

+0

Спасибо, что ответили, но ответ Wiktor короче и не нуждается в объектах Pattern или Matcher. +1 для вас, так или иначе, чтобы показать мне метод 'Matcher.group()'. – Seblor

+0

Возвращаемое значение 'split' является массивом String, а не строкой с' \ n'. Для того, чтобы получить массив, этот дополнительный код необходим.Что, если в вашей исходной строке уже есть '\ n', тогда как бы вы определили, где находится исходный' \ n', а где находится вновь вставленный – anubhava

0

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

line.split("\\s+"); 

Это проливает каждое слово одним или несколькими пробелами.

+1

. Думаю, вам нужно перечитать вопрос. (И у меня уже есть ответ) – Seblor

Смежные вопросы