Скажем, у меня есть такая строка, как:
"Hello how are you doing?"
Мне нужна функция, которая превращает несколько пробелов в одно пространство.
Так я бы получил:
"Hello how are you doing?"
Я знаю, что могу использовать регулярное выражение или позвонить
string s = "Hello how are you doing?".replace(" "," ");
Но мне пришлось бы вызывать его несколько раз, чтобы убедиться, что все последовательные пробелы заменены только одним.
Есть ли уже встроенный метод для этого?
c#
string
whitespace
Мэтт
источник
источник
Ответы:
источник
Этот вопрос не так прост, как на других плакатах (и как я изначально полагал), потому что вопрос не совсем точен, как должен быть.
Есть разница между «пробелом» и «пробелом». Если вы имеете в виду только пробелы, вам следует использовать регулярное выражение
" {2,}"
. Другое дело, если вы имеете в виду любые пробелы. Должны ли все пробелы быть преобразованы в пробелы? Что должно произойти с пространством в начале и в конце?Для теста ниже я предположил, что вас интересуют только пробелы, и вы не хотите ничего делать с отдельными пробелами, даже в начале и в конце.
Обратите внимание, что правильность почти всегда важнее производительности. Тот факт, что решение Split / Join удаляет любые начальные / конечные пробелы (даже только отдельные пробелы), неверен в соответствии с вашими указанными требованиями (которые, конечно, могут быть неполными).
В тесте используется MiniBench .
Несколько тестовых прогонов:
Здесь первое число - это количество итераций, второе - это затраченное время, а третье - это масштабированная оценка, где 1.0 является лучшим.
Это показывает, что по крайней мере в некоторых случаях (включая этот) регулярное выражение может превзойти решение Split / Join, иногда с очень значительным отрывом.
Однако, если вы измените требование «все пробелы», то Split / Join , похоже, победит. Как это часто бывает, дьявол кроется в деталях ...
источник
Обычный эспрессоин - самый простой способ. Если вы напишете регулярное выражение правильно, вам не понадобится несколько вызовов.
Измените его на это:
источник
@"\s{2,}"
заключается в том, что он не может заменить отдельные вкладки и другие символы пробела Unicode пробелом. Если вы собираетесь заменить 2 табуляции пробелом, то вам, вероятно, следует заменить 1 табуляцию пробелом.@"\s+"
сделаю это за вас.Хотя существующие ответы хороши, я хотел бы указать на один подход, который не работает:
Это может повторяться бесконечно. Кто-нибудь хочет угадать, почему? (Я наткнулся на это только тогда, когда несколько лет назад его задали как вопрос группы новостей ... кто-то действительно столкнулся с этим как с проблемой.)
источник
Как уже отмечалось, это легко сделать с помощью регулярного выражения. Я просто добавлю, что вы, возможно, захотите добавить к нему .trim (), чтобы избавиться от начальных / конечных пробелов.
источник
Вот решение, с которым я работаю. Без RegEx и String.Split.
так что вы можете:
источник
Быстрое средство для удаления лишних пробелов от Фелипе Мачадо. (Изменено RW для удаления нескольких пространств)
Тесты ...
Примечания к тестам: режим выпуска, отладчик не подключен, процессор i7, в среднем 4 прогона, протестированы только короткие строки
SwitchStmtBuildSpaceOnly, автор - Фелипе Мачадо, 2015 г. и изменен Sunsetquest.
InPlaceCharArraySpaceOnly, автор - Фелипе Мачадо, 2015 г. и изменен Sunsetquest.
SwitchStmtBuild Фелипе Мачадо 2015 и изменен Sunsetquest
SwitchStmtBuild2, автор - Фелипе Мачадо, 2015 г., модифицирован Sunsetquest.
SingleSpacedTrim от Дэвида С. 2013
Fubo (StringBuilder) от fubo 2014
SplitAndJoinOnSpace, Джон Скит, 2009 г.
RegExWithCompile, Джон Скит, 2009 г.
User214147 от пользователя user214147
RegExBrandon от Брэндона
RegExNoCompile, автор Тим Хулихан
Код теста находится на Github
источник
Я делюсь тем, что использую, потому что, похоже, я придумал что-то другое. Я использую это некоторое время, и для меня это достаточно быстро. Я не уверен, как это сочетается с другими. Я использую его для записи файлов с разделителями и запускаю через него большие таблицы данных по одному полю за раз.
источник
Используя тестовую программу, которую опубликовал Джон Скит, я попытался проверить, смогу ли я заставить рукописный цикл работать быстрее.
Я могу обыграть NormalizeWithSplitAndJoin каждый раз, но только обыграть NormalizeWithRegex с входами 1000, 5.
Я не смотрел на машинный код, который производит джиттер, однако я полагаю, что проблема заключается во времени, затраченном на вызов StringBuilder.Append (), и для того, чтобы добиться большего успеха, потребуется использование небезопасного кода.
Итак, Regex.Replace () очень быстрый и его сложно превзойти !!
источник
VB.NET
C #
Наслаждайтесь мощью LINQ = D
источник
string.Join(" ", myString.Split(' ').Where(s => s != " ").ToArray())
Split
для перехвата всех пробелов и удаленияWhere
предложения:myString.Split(null as char[], StringSplitOptions.RemoveEmptyEntries)
источник
Наименьшее решение:
var regExp = / \ s + / g, newString = oldString.replace (regExp, '');
источник
Вы можете попробовать это:
источник
Группы замены обеспечивают реализующий подход, разрешающий замену нескольких символов пробела одним и тем же одним:
Обратите внимание, что второй пример остается единичным,
\n
а в принятом ответе конец строки заменяется пробелом.Если вам нужно заменить любую комбинацию пробелов на первую, просто удалите обратную ссылку
\k
из шаблона.источник
Использование регулярного выражения для замены двух или более пробелов одним пробелом также является хорошим решением.
Мы используем шаблон регулярного выражения как « \ s + ».
\ s соответствует пробелу, табуляции, новой строке, возврату каретки, подаче страницы или вертикальной табуляции.
«+» означает одно или несколько вхождений.
Пример регулярного выражения
источник
Для этого нет встроенного средства. Вы можете попробовать это:
Это удалит начальные и конечные пробелы, а также свернет все внутренние пробелы до одного символа пробела. Если вы действительно хотите сворачивать только пробелы, тогда решения, использующие регулярное выражение, лучше; в противном случае это решение лучше. (См. Анализ, сделанный Джоном Скитом.)
источник
source.ToCharArray()
а затем выбрасываете результат?ToCharArray()
результата string.Join только для создания новой строки ... вау, появление этого сообщения с жалобой на накладные расходы просто замечательно. -1.whitespace
этоnew char[] { ' ' }
, это даст неправильный результат , если входная строка начинается или заканчивается с пространством.