Я пытаюсь разделить предложение, которое печатается на консоль, чтобы избежать обрезания, как это @80 символов:
Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave ad
venturer?
Поэтому я бы хотел, чтобы он печатался так
Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave
adventurer?
Есть ли способ сделать это с помощью String.split()
?
split
здесь не лучший вариант, но вы можете использовать классы Pattern
и Matcher
с этим регулярным выражением
\\G.{1,80}(\\s+|$)
что значит
\\G
место последнего совпадения, или если это первая итерация поиска соответствия (так что еще не было) начала строки (представленной ^
).{1,80}
любые символы могут появляться между один и восемьдесят раз(\\s+|$)
одно или несколько пробелов или конец строкиВы можете использовать его таким образом
String data = "Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave "
+ "adventurer? ";
Pattern p = Pattern.compile("\\G.{1,80}(\\s+|$)");
Matcher m = p.matcher(data);
while(m.find())
System.out.println(m.group().trim());
Вывод:
Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave
adventurer?
Но предполагая, что вы можете столкнуться с очень длинными словами, которые не должны быть разделены, вы можете добавить
\\S{80,}
к вашему регулярному выражению, чтобы также позволить ему находить строки без пробелов, длина которых составляет 80 или более.
Пример:
String data = "Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave "
+ "adventurer? foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar";
Pattern p = Pattern.compile("\\G.{1,80}(\\s+|$)|\\S{80,}");
Matcher m = p.matcher(data);
while (m.find())
System.out.println(m.group().trim());
Вывод:
Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave
adventurer?
foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar
Вы можете сделать что-то вроде этого, где вы решите, нужно ли делать новую строку или нет, в зависимости от текущего размера строк:
public static String getLines(String line){
String[] words = line.split(" ");
StringBuilder str = new StringBuilder();
int size = 0;
for (int i = 0; i < words.length; i++) {
if(size==0){
str.append(words[i]);
}
if(size+words[i].length()+1<=80){
str.append(" ").append(words[i]);
size++;
}else{
str.append("\n").append(words[i]);
size = 0;
}
size+=words[i].length();
}
return str.toString();
}
Другой способ сделать то же самое:
public static String getLines2(String line){
StringBuilder str = new StringBuilder();
int begin = 0;
while(begin<line.length()){
int lineEnd = Math.min(begin + 80, line.length());
while(lineEnd<line.length()&&line.charAt(lineEnd)!= ' '){
lineEnd--;
}
str.append(line.subSequence(begin, lineEnd));
if(lineEnd<line.length()) str.append("\n");
begin = lineEnd+1;
}
return str.toString();
}
В зависимости от того, насколько точно он должен быть, Regex может сделать это довольно хорошо. Если вам просто нужно разделить на пробелы, просто
String eg = "Example sentence with, some. spaces! and stuff";
String[] splitSentence = eg.split(" ");
будет выполнять задание, разбивая строку в каждом пространстве и тем самым возвращая слова со своими соседними специальными символами в виде массива String. Затем вы можете просто добавить символы (с пробелами между ними), и если вы пройдете границу (в вашем случае 80), введите последнее слово и добавьте '\n'
:
String getConsoleFormattedString(String s, int rowLength) {
String[] split = s.split(" ");
String ret = "";
int counter = 0,
for(int i = 0; i < split.length; i++) {
if(counter + split[i] + 1 <= 80)
ret += split[i] + " ";
else {
ret += "\n";
counter = 0;
i--;
}
}
return ret;
}
Я дам вам понять, как обрабатывать слова с> 80 буквами, ради простоты