Хорошо этот ответ согласно выяснены требованиям, указанным в Баунти:
мне также нужно удалить все завершающие символы новой строки, и мой Regex-фу терпит неудачу. Моя щедрость идет к любому, кто может дать мне регулярное выражение, которое передает этот тест: StripWhitespace ("test \ r \ n \ r \ nthis \ r \ n \ r \ n") == "test \ r \ nthis"
Так вот ответ:
(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z
Или в C# код, предоставленный Schmich @ Крис:
string fix = Regex.Replace("test\r\n \r\nthis\r\n\r\n", @"(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z", string.Empty, RegexOptions.Multiline);
Теперь давайте попробуем понять. Здесь есть три дополнительных шаблона, которые я готов заменить на string.empty
.
(?<=\r?\n)(\s*$\r?\n)+
- соответствует один к неограниченному линий, содержащий только пробела и предваряются разрывом строки (но не совпадает с первыми брейками предшествующей строки).
(?<=\r?\n)(\r?\n)+
- соответствует одному из неограниченных пустых строк без содержимого, которое предшествует разрыву строки (но не соответствует первым перерывам в строке).
(\r?\n)+\z
- соответствует один к неограниченному линии ломается в конце тестируемой строки (конечные разрывы строк, как вы их называли)
Это удовлетворяет тест отлично! Но также удовлетворяет как \r\n
, так и \n
линиям стилей! Проверьте это! Я считаю, что это будет самый правильный ответ, хотя более простое выражение передаст ваш заданный тест на награду, это регулярное выражение проходит более сложные условия.
EDIT: @ Указывает на потенциальный недостаток в последнем совпадении шаблонов указанного выше регулярного выражения, поскольку он не будет соответствовать разрыву строк, содержащему пробел в конце тестовой строки.Итак, давайте изменим этот последний шаблон на этот:
\b\s+\z
\ b - это граница слов (начало или конец слова), \ s + - одно или несколько символов пробела, \ z - это конец теста строка (конец «файла»). Таким образом, теперь он будет соответствовать любому ассортименту пробелов в конце файла, включая вкладки и пробелы, а также возврат каретки и разрывы строк. Я тестировал оба теста, предоставленные @ Will.
Так теперь все вместе, это должно быть:
(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z
EDIT # 2: Хорошо есть один более возможный случай @Wil обнаружил, что последнее регулярное выражение не распространяется. Этот случай представляет собой входные данные, которые имеют разрывы строк в начале файла перед любым контентом. Поэтому давайте добавим еще один шаблон в соответствие с началом файла.
\A\s+
- \A
соответствует началу файла, \s+
соответствует одному или нескольким символам пробела.
Так что теперь у нас есть:
\A\s+|(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z
Так что теперь у нас есть четыре модели для сопоставления:
- пробелы в начале файла,
- разрывы избыточные строки, содержащие пробелы , (например:
\r\n \r\n\t\r\n
)
- избыточные разрывы строк без содержания, (например:
\r\n\r\n
)
- пробелы в конце файла
Регулярное и быстрое выражение. Какой аспект вы пытаетесь оптимизировать, когда говорите «лучший способ»? Читаемость? Время? Использование памяти? –
Я бы сказал, что читаемость будет самой важной в этом случае. – FunLovinCoder
Считываемость редко приравнивается к регулярным выражениям –