Как бы я пошел на разделение предложения в Java

1

Я пытаюсь разделить предложение, которое печатается на консоль, чтобы избежать обрезания, как это @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()?

  • 0
    Можете ли вы использовать \ n во время печати?
  • 0
    Я хотел бы просто иметь метод, где я могу передать строку текста, а затем он фильтрует и корректирует его для меня. Я прошу прощения, если это не было ясно.
Показать ещё 5 комментариев
Теги:
string
split

3 ответа

0

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
0

Вы можете сделать что-то вроде этого, где вы решите, нужно ли делать новую строку или нет, в зависимости от текущего размера строк:

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();
}
0

В зависимости от того, насколько точно он должен быть, 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 буквами, ради простоты

Ещё вопросы

Сообщество Overcoder
Наверх
Меню