2013-06-13 5 views

ответ

5

Capture первый символ вместо этого, и записать его обратно:

"abc123.-def45".gsub(/(.)./, '\[email protected]') 

Очень важно, чтобы вы не сделать второй символ необязателен. В противном случае в строке нечетной длины последний символ приведет к совпадению, и будет добавлен @. Без ? последний символ просто провалится и останется нетронутым.

Working demo.

+0

большое спасибо вот превосходное объяснение – user1297102

1

Вы также можете сделать это, чтобы избежать замены @ в последовательности

"abc123.-def45".gsub(/([^@])[^@]/, '\[email protected]') 
+2

Это будет компенсировать чередование на единицу (так что вместо четных позиций заменяются нечетные), если есть хотя бы один '@'. Например. 'abcd @ efgh' приведет к' a @ c @@ e @ g @ 'вместо' a @ c @@@ f @ h'. –

+0

спасибо вам за то, что вы показываете разные способы использования regex – user1297102

1

Ниже код будет работать:

irb(main):005:0> "abc123.-def45".chars.each_with_index.map {|e,i| !i.even? ? e = "@" : e}.join 
=> "[email protected]@[email protected]@[email protected]@5" 
+0

спасибо, я ищу работу над своим регулярным выражением :-) – user1297102

+0

ах, может быть, я не читал между строк :-) –

Смежные вопросы