2015-08-21 1 views
1

У меня есть строка, как это:Заменить символы, не слово, если данная последовательность не соответствует

"Jim-Bob's email @@@[email protected]@@[email protected]@@[email protected]@@ is: [email protected]" 

Я хочу, чтобы заменить все символы без слов (символов и пробелов), за исключением @@@ разделителей.

настоящее время я использую:

str.gsub(/[^\[email protected]]+/, 'X') 

, который дает:

"[email protected]@@[email protected]@@[email protected]@@[email protected]@@[email protected]" 

На практике это достаточно хорошо, но это оскорбляет меня по двум причинам:

  • The @ в электронном адресе не заменяется.
  • Использование [^\w] вместо \W чувствует себя неаккуратно.

Как заменить все символы без слов, если эти символы не составляют строки @@@[email protected]@@ или @@@[email protected]@@ разделителей?

+1

Каким будет желаемый результат для строки '" @@@ hl @@@@ endhl @@ "?? –

+0

Позвольте мне перефразировать мой вопрос: какой бы желаемый результат для строки' "@@@ hl @@@@ endhl @@"?? –

+0

Я бы счел, что фиктивные данные и ожидать 'XXXhlXXXXendhlXX" ' – Xuor

ответ

2
str.gsub(/(@@@.*[email protected]@@|\w+)|./) { $1 || "X" } 
# => "[email protected]@@[email protected]@@[email protected]@@[email protected]@@XisXXjbXexampleXcom" 

Этого подход использует тот факт, что чередования работать как case структура: первое соответствие один потребляет соответствующую строку, то никакого дальнейшего соответствия не делается на него. Таким образом, @@@.*[email protected]@@ будет использовать маркер (например, @@@[email protected]@@, в нем нет ничего другого. Мы также сопоставляем любую последовательность словных символов. Если кто-либо из них захвачен, мы можем просто вернуть их как есть ($1). Если нет, то мы сопоставляем любой другой символ (т. е. не внутри маркера, а не символ слова) и заменяем его "X".

+0

Почему бы не опубликовать простое объяснение для будущих посетителей. Мне нравится ваше решение, но на самом деле это не ответ, если кто-то не узнает что-то. – engineersmnky

+0

... Я должен был опубликовать этот вопрос несколько часов назад. Я потратил гораздо больше времени на то, как решить его, чем вы. Спасибо! – Xuor

1

Что касается вашего второго пункта, я думаю, вы слишком много спрашиваете; нет простого способа избежать этого.

Что касается первого пункта, то простой способ заключается в том, чтобы временно заменить "@@@" символом, который вы никогда не будете использовать (допустим, вы используете систему без "\r", чтобы этот символ не использовался, мы можем использовать это как временная замена).

"Jim-Bob's email @@@[email protected]@@[email protected]@@[email protected]@@ is: [email protected]" 
.gsub("@@@", "\r").gsub(/[^\w\r]/, "X").gsub("\r", "@@@") 
# => "[email protected]@@[email protected]@@[email protected]@@[email protected]@@XisXXjbXexampleXcom" 
+1

Склонно согласиться с педантичной природой моего второго момента, но подумал, что это стоит упомянуть. Я также определенно рассмотрел двухэтапный поиск/замену , но пытались избежать слишком много проходов через мою строку, ради удобства чтения. Цените солидные идеи! – Xuor

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