Обрезать пробелы из середины строки

Я использую следующее регулярное выражение для захвата поля описания с фиксированной шириной, длина которого всегда 50 символов:

(?.{50})

Моя проблема в том, что описания иногда содержат много пробелов, например

"FLUID        COMPRESSOR                          "

Может ли кто-нибудь предоставить регулярное выражение, которое:

  • Обрезает все пробелы с конца
  • Сбрасывает пробелы между словами в одно пространство

Ответ 1

Подставьте два или более пробела для одного пространства:

s/  +/ /g

Изменить: для любого пробела (а не только для пробелов) вы можете использовать \s, если вы используете совместимую с perl библиотеку регулярных выражений, и синтаксис фигурного скобки для количества вхождений, например

s/\s\s+/ /g

или

s/\s{2,}/ /g

Изменить №2: забыл глобальный суффикс /g, благодаря JL

Ответ 2

str = Regex.Replace(str, " +( |$)", "$1");

Ответ 3

Perl-варианта: 1) s/\ s + $//; 2) s/\ s +//g;

Ответ 4

С#:

Только если вы хотите обрезать все белые пробелы - в начале, в конце и в середине.

     string x = Regex.Replace(x, @"\s+", " ").Trim();

Ответ 5

Есть ли конкретная причина, по которой вы запрашиваете регулярное выражение? Они не могут быть лучшим инструментом для этой задачи.

Замена вроде

 s/[ \t]+/ /g

должен сжимать внутренние пробелы (на самом деле, он также будет сжимать ведущее и завершающее пробелы, но это не похоже на то, что это проблема.) и

s/[ \t]+$/$/

позаботится о завершающем пробеле. [Я использую синтаксис sed ish здесь. Вы не сказали, какой вкус вы предпочитаете.]


Сразу же я не вижу способа сделать это в одном выражении.

Ответ 6

Так как сжатие пробелов и обрезка пробелов по краям - концептуально разные операции, мне нравится делать это в два этапа:

re.replace("s/\s+/ /g", str.strip())

Не самый эффективный, но вполне читаемый.

Ответ 7

/(^ [\ s\t] + | [\ s\t] + ([\ s\t] | $))/g заменить на $2 (начало | средний/конец)