Руби удалить все, кроме некоторых персонажей? - PullRequest
4 голосов
/ 15 марта 2012

Как я могу удалить из строки все символы, кроме пробелов, чисел и некоторых других?Примерно так:

oneLine.gsub(/[^ULDR0-9\<\>\s]/i,'')

Мне нужно только: 0-9 l d u r < > <space>

Кроме того, есть ли хороший документ об использовании регулярных выражений в Ruby, например, список специальных символов с примерами?

Ответы [ 3 ]

8 голосов
/ 15 марта 2012

Регулярное выражение, которое у вас есть, уже работает правильно.Однако вам необходимо присвоить результат обратно строке, с которой вы работаете.В противном случае вы не изменяете строку (.gsub() не изменяет строку на месте).

Вы можете немного улучшить регулярное выражение, добавив квантификатор '+' (чтобы можно было заменить последовательные символына одном дыхании).Кроме того, вам не нужно экранировать угловые скобки:

oneLine = oneLine.gsub(/[^ULDR0-9<>\s]+/i, '')

Хороший ресурс с особым вниманием к регулярным выражениям Ruby - это книга регулярных выражений , написанная Яном Гойваертсом и Стивеном Левитаном.Хорошее онлайн-руководство от того же автора: здесь .

5 голосов
/ 15 марта 2012

Старый добрый String#delete делает это без регулярного выражения. ^ означает «НЕ».

str = "12eldabc8urp pp"
p str.delete('^0-9ldur<> ') #=> "12ld8ur "
3 голосов
/ 15 марта 2012

Просто для полноты: вам не нужно регулярное выражение для этой конкретной задачи, это можно сделать с помощью простой операции со строками :

irb(main):005:0> "asdasd123".tr('^ULDRuldr0-9<>\t\r\n ', '')
=> "dd123"

Также есть tr!метод, если вы хотите заменить старое значение:

irb(main):009:0> oneLine = 'UasdL asd 123'
irb(main):010:0> oneLine.tr!('^ULDRuldr0-9<>\t\r\n ', '')
irb(main):011:0> oneLine
=> "UdL d 123"

Это также должно быть немного быстрее (но производительность не должна быть большой проблемой в Ruby:)

...