2016-05-10 3 views
2

Предположим, у меня есть адрес электронной почты '[email protected]'. Я хочу заменить все символы между «a» и «f», поэтому результат будет выглядеть как «a****[email protected]».Regex для замены символов между строками

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

str.replace(/^(.*?)@/gi, '*'); 

Но результаты выглядят как этот

*gmail.com 

Есть ли способ сделать то, что мне нужно?

+0

Попробуйте это:^[A-Za-Z0-9 # $% '* + - \/=^_ '{|} ~!?] (*.?). @ – mba12

+0

Это было решение, которое я нашел, что отлично работает в узле.js, но использует взгляд вперед и назад. str.replace (/(?!^).(?=[^@][email protected])/ gi, '*') – Geuis

ответ

1

Я хотел бы использовать replace с обратного вызова, в котором пользователь средняя часть может быть также заменен * с:

var email = "[email protected]"; 
 
document.write(email.replace(/^(.)(.*)([email protected][^@]*)$/, function(m, g1, g2, g3) { 
 
    return g1 + g2.replace(/./g, "*") + g3; 
 
}));

Вот как "внешняя" /^(.)(.*)([email protected][^@]*)$/ регулярные выражения работы:

  • ^ - спички начала строки
  • (.) - Группа 1: любой первый символ
  • (.*) - Группа 2: любые символы вверх до символа перед последним @ `
  • ([email protected][^@]*) - Группа 3: один символ до последнего @, затем @, а затем любые 0+ символов, кроме @ до ...
  • $ - конец строки

.replace(/./g, "*") будет просто заменить любой символ с *. И это будет сделано только в группе 2.

Регулярное выражение, которое вы предложили в комментарии, должно также работать.

/(?!^).(?=[^@][email protected])/g соответствует любому символу, кроме символа новой строки, который не является первым символом ((?!^)) и имеет 1+, кроме @ после него и @ символов.

var re = /(?!^).(?=[^@][email protected])/g; 
 
document.body.innerHTML = "[email protected]".replace(re, "*");

+0

Интересный подход. Я собираюсь принять это, потому что ваше решение работает как в средах javascript клиента, так и на сервере. Я также нашел это регулярное выражение, которое работает в узле, но использует взгляд вперед и назад. str.replace (/(?!^).(?=[^@][email protected])/ gi, '*') – Geuis

+0

'(?! ^). (? = [^ @] + @)' использует только lookaheads и будет работать в JavaScript. Он соответствует любому символу, но символу новой строки, который не является первым символом ('(?! ^)') И имеет 1+ символов, кроме '@' после него и '@'. –

2

Это не ответ на ваш реальный вопрос, но я хотел бы оспорить вас, что ваша идея не такая хорошая. Лучше всего не, чтобы показать, как долго адрес электронной почты, заменив внутренние буквы тем же номером * s. Лучше использовать фиксированное число * s.

Вы, кажется, использует JavaScript, который не имеет утверждения 'назад', и захватив в этом случае может быть проще, тоже, чтобы понять, так что я хотел бы сделать это, чтобы заменить с постоянным числом * s

str.replace(/^(.).*([email protected])/, '$1***$2') 
+1

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

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