Обрезка строки до k-го символа без разрезания слова в середине - PullRequest
0 голосов
/ 04 марта 2020

Учитывая строку и число k, обрежьте строку так, чтобы длина строки <= k и вырезка не разбивала слово или не делала новую строку конечной sh с пробелом. </p>

Например, : "доброе утро всем" с k = 15 вернет "доброе утро".

Это мой код

int main() {
    string str = "good morning everybody";
    int k = 15,i;
    for (i = k; i > 0; i--)
        if(str[i] == ' ' && (str[i-1] >= 'a' && str[i-1] <= 'z'))
            break;

    for (int j = 0; j < i; j++)
        cout << str[j];

    return 0;
}

но мне интересно, есть ли лучший способ сделать это используя регулярные выражения или другие трюки C ++. (Я иду из Python мира).

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Используя regex, вы можете сделать это следующим образом:

"^.{14}[\s]*[^\s]+"

В C ++ вы можете использовать std::format, std::regex et c

0 голосов
/ 04 марта 2020

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

^\b[\w ]{0,14}(?=\w(?=\s)).

Попробуйте это здесь

Обратите внимание, что если Ваша граница - N, тогда вы должны использовать N-1 в регулярном выражении. Таким образом, если N равно 15, то его следует использовать как 14 в регулярном выражении /

0 голосов
/ 04 марта 2020

std::string имеет функцию-член find_last_of, которая находит в нем последнее вхождение символа (или одного из нескольких символов). Используя это, вы можете написать свою функцию так:

std::string cut(std::string const & s, std::size_t k)
{
  std::size_t pos = s.find_last_of(' ', k); // looks only in [s, s+k)
  return s.substr(0, pos);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...