2012-09-06 1 views
3

Развернуть дальше answer, используя это регулярное выражение (?<=\\G.{" + count + "}); Я также хотел бы изменить выражение на не разделить слова в середине.Сплит-строка на n-ом символе, сохраняющем слова

Пример:

String string = "Hello I would like to split this string preserving these words"; 

, если я хочу, чтобы разделить на 10 символов, она будет выглядеть следующим образом:

[Здравствуйте, я шо, пакетирование, как т, о разделенной го, является строка , сохраняя эти Уборочные Д.С.]

Вопрос:

Возможно ли это, используя только regex, или потребуется лексер или некоторые другие манипуляции с строкой?

UPDATE

Это то, что я хочу, чтобы использовать его на:

 
+ -------------------------------------------JVM Information------------------------------------------ + 
| sun.boot.class.path : C:\Program Files\Java\jdk1.6.0_33\jre\lib\resources.jar;C:\Program Files\Java\ | 
|      jdk1.6.0_33\jre\lib\rt.jar;C:\Program Files\Java\jdk1.6.0_33\jre\lib\sunrsasig | 
|      n.jar;C:\Program Files\Java\jdk1.6.0_33\jre\lib\jsse.jar;C:\Program Files\Java | 
|      \jdk1.6.0_33\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_33\jre\lib\charset | 
|      s.jar;C:\Program Files\Java\jdk1.6.0_33\jre\lib\modules\jdk.boot.jar;C:\Progra | 
|      m Files\Java\jdk1.6.0_33\jre\classes           | 
+ ---------------------------------------------------------------------------------------------------- + 

Ящик вокруг него имеет ограничение на количество символов минус ключ ширины, однако это не выглядит хорошо. Этот пример также не является единственным прецедентом, я использую этот блок для нескольких типов информации.

+1

Можете ли вы изменить это, чтобы стать самостоятельным вопросом? (Держите ссылку, хотя) – Thilo

+0

Я бы использовал простой лексер. Это может быть немного дольше, но было бы легче понять. ;) –

+1

@Thilo, done :) – epoch

ответ

2

«не разделенные слова в середине» не определяет, что должно произойти в случае «не расщепления».

Учитывая длину раскола быть 10 и строку:

Hello I would like to split this string preserving these words 

Если вы хотите разделить сразу после слова, в результате чего в списке:

Hello I would, like to split, this string, preserving, these words 

Вы можете выполнить все виды сложно «расщепляется» с помощью простого сопоставления.

Просто матч всех вхождений этого выражения: (. С помощью (?s) включить DOTALL флаг)

(?s)\G.{10,}?\b 

В Perl это так просто, как @array = $str =~ /\G.{10,}?\b/gs, но Java, кажется, не хватает функции быстрого для возврата всех совпадений, поэтому вам, вероятно, придется использовать совпадение и вывести результаты в массив/список.

1

Нет регулярных выражений, но это, кажется, работает:

List<String> parts = new ArrayList<String>(); 
while (true) { 
    // look for space to the left of n-th character 
    int index = string.lastIndexOf(" ", n); 
    if (index == -1) { 
     // no space to the left (very long word) -> next space to the right 
     // change this to 'index = n' to break words in this case 
     index = string.indexOf(" ", n); 
    } 
    if (index == -1) { 
     break; 
    } 
    parts.add(string.substring(0, index)); 
    string = string.substring(index+1); 
} 
parts.add(string); 

Это будет первый взгляд, если есть пространство слева от п-го символа. В этом случае строка разделяется. В противном случае он ищет следующее пространство справа. Кроме того, вы можете сломать слово в этом случае.

+2

Это не учитывает разрывы слов, которые не являются пространством, например, символом новой строки, периодом, двоеточием, точкой с запятой и т. Д. В этот момент лучше использовать регулярное выражение для поиска разрывов слов и остальной части вашего алгоритма, чтобы добавить его в список. – Neil

+0

@tobiask, проблема заключается в том, что мой 'n' является жестким пределом, строка не может быть длиннее, чем' n' – epoch

+0

Продвинутый код, но теперь, когда я вижу ваш пример, может быть лучше искать ' '\' 'вместо' ''' или использовать регулярное выражение для этой части, как указывает Нил. –

1

Я рассмотрел эту проблему, и ни один из этих ответов на самом деле не убедил меня! Вот моя версия. Очень вероятно, что его можно улучшить.

public static String[] splitPresenvingWords(String text, int length) { 
    return text.replaceAll("(?:\\s*)(.{1,"+ length +"})(?:\\s+|\\s*$)", "$1\n").split("\n"); 
} 
Смежные вопросы