regex - 如何使用这种模式创建正则表达式?
问题描述
有人知道我怎样才能制作这种模式的正则表达式?
对于我的问题,输入示例为ggggggg@aaaaa.com.br
,预期输出为gg***gg@aa***.com.br
. 如您所见,@ 之前的字母只会被替换为 ,如果字符串超过 4 个字符,遵循模式gg**gg@
,并且在 @ 之后的两个字母后跟 * 直到电子邮件提供商的末尾。
另一个例子是当有 3 个字母或更少时:
从ggg@aaaaa.com
到g*g@aa***.com
我试图这样做,但它仍然无法正常工作:
regex = /(^.{2})(.*)(.{2})@(.{2})(?:(?=\.)(.*)|(\w+)(.*))/gm;
谢谢您的帮助!
解决方案
使用 JavaScript,您可以使用捕获组,并根据第 1 组和第 2 组中的字符数组成返回字符串。
([^\s@]+)@([^\s@.]+)(\.[^\s@]+)
模式匹配
([^\s@]+)
捕获组 1,匹配除@
空格字符以外的任何字符 1 次以上@
匹配@
([^\s@.]+)
捕获组 2,匹配 1 次以上的任何字符,除了.
@
或 whitspace 字符(\.[^\s@]+)
捕获组 3,匹配单个点和电子邮件地址的其余部分
const regex = /([^\s@]+)@([^\s@.]+)(\.[^\s@]+)/;
const strings = [
"ggggggg@aaaaa.com.br",
"abcdefghijklmnop@aaaaa.com.br",
"abc@aaaaa.com",
"gg@aaaaa.com",
"g@aaaaa.com",
"@aaaaa.com",
];
strings.forEach(s => {
let res = s.replace(regex, (_, g1, g2, g3) => {
let first = g1;
if (g1.length === 3) {
first = `*${g1.charAt(1)}*`
}
if (g1.length > 3) {
first = `**${g1.slice(2, -2)}**`
}
return `${first}@${'*'.repeat(g2.length)}${g3}`
});
console.log(res);
})
推荐阅读
- serial-port - 串行通信不返回确认是标准做法吗?
- spring-boot - 启动时 Spring Data GemFire 和 GemFire 缓存与 Spring Boot 之间的松散耦合
- r - 如何根据文件名中的日期选择目录中的文件并复制到另一个文件夹
- python - import 语句的正确语法
- angular - 如何将数据发送到嵌套组件(父子(父)子)?
- reactjs - 如何在 React 中实现 PWA,以便我的应用程序可以离线工作
- python - Python xml-rpc tcp 持久连接
- c++ - 将“提取器”传递给也采用可迭代对象的 C++ 方法
- azure - SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserId FROM root c) AS t not working
- python - 为什么我需要使用异步工具来发送 Django 电子邮件