Попытка запутать электронное письмо в этом формате:
a***@******m
Это означает, что мне нужно регулярное выражение для соответствия всему, кроме первого и последнего символа, а также @.
Я могу использовать [^@]
для всего, но как игнорировать последний и первый символы в строке? Якоря кажутся подходящими, но каков точный синтаксис?
Как насчет использования смотреть вперед:
(?!^|.$)[^@\s]
См. эту демонстрацию на regex101
Я также добавил белое пространство к символам, которые не будут заменены.
Если инструмент или язык, который вы используете, поддерживает обходные пути, вы можете использовать:
(?<!^)[^@](?!$)
Демо: https://regex101.com/r/5Tbaq7/1
Язык не помечен, но если вы используете язык программирования и хотите убедиться, что в адресе электронной почты есть знак @ и что отображаются первый и последний символы, вы можете использовать группы захвата и использовать замену в адресе электронной почты. группы, которые вы хотите показать с помощью *
:
^(\S)([^@\n]*)(@)([^@\n]*)(\S)$
^
Начало строки(\S)
Группа захвата 1, соответствует символу без пробелов([^@\s]*)
Захват группы 2, совпадение 0+ раз без символа @ или пробела(@)
Захватите группу 3, сопоставьте @
([^@\s]*)
Захват группы 4, совпадение 0+ раз без символа @ или пробела(\S)
Захватите группу 5, сопоставьте символ без пробелов$
Конец строкиДемонстрация регулярных выражений
Например, используя javascript
let pattern = /^(\S)([^@\s]*)(@)([^@\s]*)(\S)$/;
[
"[email protected]",
"te st@te st.com",
"test@[email protected]",
"te@nl",
"t@t",
"test@",
"@tes",
"test"
].forEach(str => {
let replaced = str.replace(pattern, function(_, g1, g2, g3, g4, g5) {
return g1 + g2.replace(/./g, "*") + g3 + g4.replace(/./g, "*") + g5;
});
console.info(replaced);
});
Вы можете заменить этот отрицательный просмотр назад на отрицательный просмотр вперед, чтобы инструменты, использующие JS-движок (не ECMA2018), могли его использовать.