2013-03-15 2 views
3

Я пытаюсь форматировать строку следующим образомФорматирование строки с RegExp установить разделитель

Убедитесь, что все номера используйте дефис для разделителей. Пример: 480.01.4430 и 480014430 оба будут 480-01-4430.

это то, что я придумал до сих пор, но я не могу понять, почему он не работает

def format_ssns(string) 
    ssn = string[/\d{9}/] 
    ssn.gsub(/\d{9}/, /\d{3}-\d{2}-\d{4}/) 
end 

ответ

5

Это странно, что вы не получаете исключение: Второй аргумент gsub должен быть String (или что-то, что можно преобразовать в String), а не в regexp.

Вот рабочий пример:

ssn = '123456789' 
ssn.gsub(/(\d{3})(\d{2})(\d{3})/, '\1-\2-\3') 
# => "123-45-6789" 

Есть три группы цифр в исходной строке. Мы вставляем каждую группу в круглые скобки. Каждая пара круглых скобок создает группу . В заменяющей строке мы используем \1, чтобы включить первую группу совпадений, \2, чтобы включить вторую группу совпадений, и \3, чтобы включить третью группу соответствий, с дефисами между ними.

+0

'/ \ d {3} - \ д { 2} - \ d {4}/'отвечает' to_s', что, вероятно, является причиной его проскальзывания. –

+0

@the - В 1.8.7, 1.9.3 и 2.0.0 Если я передаю регулярное выражение в качестве второго параметра в gsub, я получаю исключение TypeError. Является ли OP с использованием Rails еще одним нечетным обезьянным патчем? –

+0

Возможно, OP не вызывает данный метод. –

2

Если вы не заботитесь о чем-либо в строке, чем это не цифра, вы можете раздеться все остальное и формат, как вы хотите:

string.gsub(/\D/, '').gsub(/(\d{3})(\d{2})(\d{4})/, "\\1-\\2-\\3") 
Смежные вопросы