Мне нужно обработать блок текста, который может содержать некоторые ложные символы новой строки в середине некоторых полей.Я хочу удалить эти новые строки (заменив их пробелами), не удаляя «действительные» новые строки, которым всегда предшествует \t
.
Итак, я хочу заменить все новые строки, которые не являютсяпредшествует вкладка с пробелом.Чтобы все было немного сложнее, если по обе стороны от новой строки есть пробел, я хочу сохранить его.Другими словами, это
"one\ttwo\tbuckle my \nshoe\t\t\n"
станет
"one\ttwo\tbuckle my shoe\t\t\n"
, т. Е. С одним пробелом между 'my' и 'shoe', а не двумя.
EDIT -некоторые уточнения: нежелательные символы новой строки находятся в середине фрагмента обычного текста.Если между словами, где встречается новая строка, есть пробел, я хочу сохранить его.В противном случае я хочу добавить один. Например:
"one\ttwo\tbuckle my \nshoe\t\t\n"
=> "one\ttwo\tbuckle my shoe\t\t\n"
"one\ttwo\tbuckle my\nshoe\t\t\n"
=> "one\ttwo\tbuckle my shoe\t\t\n"
"one\ttwo\tbuckle my \n shoe\t\t\n"
=> "one\ttwo\tbuckle my shoe\t\t\n"
РЕДАКТИРОВАТЬ 2: неуклюжее, но рабочее решение, которое я придумал.Я не очень доволен этим, двойное дублирование кажется нелегким.
>> strings = ["one\ttwo\tbuckle my\nshoe\t\t\n", "one\ttwo\tbuckle my \nshoe\t\t\n", "one\ttwo\tbuckle my \n shoe\t\t\n"]
=> ["one\ttwo\tbuckle my\nshoe\t\t\n", "one\ttwo\tbuckle my \nshoe\t\t\n", "one\ttwo\tbuckle my \n shoe\t\t\n"]
>> strings.collect{|s| s.gsub(/[^\t]\n\s?/){|match| match.gsub(/\s*\n\s*/," ")} }
=> ["one\ttwo\tbuckle my shoe\t\t\n", "one\ttwo\tbuckle my shoe\t\t\n", "one\ttwo\tbuckle my shoe\t\t\n"]
Кажется, это работает лучше, чем любое из предложенных ниже предложений, учитывая мои теперь расширенные требования по добавлению / сохранению пробелов.