2016-09-08 5 views
1

У меня есть строка с символами новой строки, которую я хочу gsub для пробела.ruby ​​gsub new line characters

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\\r\\n]/, ' ') 

что-то вроде этого^только мое регулярное выражение, кажется, заменив 'r' и 'n' письма, а также. другое ограничение иногда повторяется дважды и, следовательно, будет заменено двумя пробелами в строке, хотя это не предпочтительнее, чем лучше, чем весь текст разрывается.

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

+1

'gsub (/ [\ r \ n] /, '')'? –

+2

Попробуйте ['.gsub (/ [\ r \ n] + /, '')'] (https://ideone.com/C79sey), если вы хотите заменить целые куски '\ r' и' \ n' с 1 единственным пространством. –

+0

Я пробовал это в http://rubular.com/, но я не получаю никаких результатов. – TheLegend

ответ

2

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

s.gsub(/\R+/, ' ') 

ВИДЕТЬ Ruby demo.

\R соответствует любому типу разрыва строки и + соответствует одному или нескольким входам квантованного подшаблона.

Обратите внимание, что в случае, если вам приходится иметь дело с более старой версией Ruby, вам нужно будет воспользоваться отрицается символьный класс[\r\n], что соответствует либо \r или \n:

.gsub(/[\r\n]+/, ' ') 

или - добавить все возможные разрывы строк:

/gsub(/(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])+/, ' ') 
+0

Дело в том, что '\\' в вашем регулярном выражении соответствует литералу '' \ '', а 'r' и' n' соответствуют буквальным буквам. –

+0

Wiktor, где вы нашли сокращение '\ R'? Я не могу найти какую-либо ссылку нигде для этого в [Ruby docs] [1] или на [regular-expressions.info] [2]? Я не думаю, что ваш пример действительно работает, по крайней мере, это не для меня в IRB. Я думаю, что в демонстрации Ruby, с которой вы связаны, она не появляется, потому что HTML-рендеринг поглощает пробелы. [1]: https://ruby-doc.org/core-2.3.1/Regexp.html [2]: http://www.regular-expressions.info/refcharclass.html – HerbCSO

+0

Мой первый комментарий был Коррумпированный, это было: Дело в том, что '' \\ '' в вашем регулярном выражении соответствует литералу '' \ '', а 'r' и' n' соответствовали буквальным буквам. –

1

Это должно работать для теста:

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\r\n]/, ' ')

Если вы не хотите, последовательные \r\n символы привести к дублированию пространств вы можете использовать вместо этого:

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\r\n]+/, ' ')

(Обратите внимание на добавление + после символьного класса.)

Как упоминалось в Wiktor, вы используетев своем регулярном выражении, которое внутри литерала регулярного выражения /.../ фактически ускользает от обратной косой черты, что означает, что вы соответствуете буквальной обратной косой чертой \, r, или n как часть вашего выражения. Экранирующие символы работают по-разному в литералах регулярных выражений, так как \ используется так много, нет смысла иметь для него особый выход (в отличие от обычных строк, которые представляют собой совершенно другое животное).