Regex для равномерной замены индекса звездочкой в ​​электронной почте - PullRequest
2 голосов
/ 16 октября 2019

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

Я сделал регулярное выражение, но онокогда-то работать с четным или с нечетной длиной имени пользователя в электронной почте.

Я хочу, чтобы одно регулярное выражение обрабатывало оба выражения. Первая буква должна постоянно отображаться в данном письме.

Пожалуйста, помогитеиспользуя регулярное выражение.

Пример: username@example.com

    Regex: Works with odd length username input Expression: (?!^).(?=([^.]([a-zA-Z0-9]{2})*)@) 
    Input : username1@example.com
    Output: u*e*n*m*1@example.com

    Regex: Works with Even length username input Expression: (?!^).(?=(([a-zA-Z0-9]{2})*)@) 
    Input : username@example.com
    Output: u*e*n*m*@example.com

Но я хочу одно выражение для обоих типов адресов электронной почты с длиной имени пользователя.

Спасибо зазаранее.

Ответы [ 3 ]

3 голосов
/ 16 октября 2019

Используя C #, вы можете использовать якорь \G и группу захвата и использовать отрицательный символьный класс, чтобы не соответствовать символу пробела или @.

Используйте заглядывание, чтобы убедиться, что есть толькоодин символ @ присутствует.

\G([^\s@])[^\s@](?=[^\s@]*@[^\s@]+(?!\S))
  • \G Утверждение позиции в конце предыдущего матча (в начале)
  • ([^\s@]) Захват в группа 1 совпадение с любым символом, кроме символа пробела или @
  • [^\s@] Совпадение не с символом пробела или @
  • (?= Положительный взгляд вперед, утверждают, что справа -
    • [^\s@]*@ Соответствует 0+ раз любому символу, кроме символа пробела или @, затем соответствует @
    • [^\s@]+ Соответствует 1+ раз любому символу, кроме символа пробела или @
    • (?!\S) Отрицательный взгляд, утверждаем, что прямо справа - символ без пробелов
  • ) Закрыть положительный взгляд

При замене используйте

$1*

Regex demo | C # демо

enter image description here

Например

string[] strings = { "File name without 3 digit end.jpg",
        "username1@example.com",
        "username@example.com",                
        "username1@example@example.com",
        "username1@",
        "test",
        };

String pattern = @"\G([^\s@])[^\s@](?=[^\s@]*@[^\s@]+(?!\S))";
Regex regex = new Regex(pattern);
string substitution = @"$1*";
foreach(string str in strings)
{
    Console.WriteLine(regex.Replace(str, substitution));
}

Выход

u*e*n*m*1@example.com
u*e*n*m*@example.com
username1@example@example.com
username1@
test
3 голосов
/ 16 октября 2019

Для этого вам не нужно регулярное выражение, вы можете использовать LINQ для выбора символов, которые вы хотите, основываясь на их индексе из имени пользователя:

var username = "username1@example.com".Split('@')[0];
var asterisked = string.Concat(username.Select((x,i) => i % 2 == 1 ? '*' : x));

Вернет u*e*n*m*1

var username = "username1@example.com".Split('@')[0];
var asterisked = string.Concat(username.Select((x,i) => i % 2 == 0 ? '*' : x));

Вернет *s*r*a*e*

(при условии, что вы используете C #)

2 голосов
/ 16 октября 2019

Вы можете использовать регулярные выражения /(\w)(\w)(?=.*@)/g с подстановкой $1*

console.log('username1@example.com'.replace(/(\w)(\w)(?=.*@)/g,'$1*'))
console.log('username@example.com'.replace(/(\w)(\w)(?=.*@)/g,'$1*'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...