我在日志中的字符串,我想掩盖基于正则表达式的值。
例如:
"email":"[email protected]", "phone":"1111111111", "text":"sample text may contain email [email protected] as well"
正则表达式应该掩盖
所需的输出:
"email":"*****", "phone":"*****", "text":"sample text may contain email ***** as well"
我已经能够做的是“文本”后,以掩盖电子邮件和电话的个体,但不存在这样的字符串内的电子邮件ID。
正则表达式发展至今:
(?<=\"(?:email|phone)\"[:])(\")([^\"]*)(\")
当你不通过匹配不是一个双引号匹配在第一部分的电子邮件地址,你可以通过还不能匹配一个双引号匹配文本的电子邮件地址。
要做到这一点的一种方法是让使用lookarounds和alternation比赛。然后更换*****
比赛
请注意,您不必逃避双引号和冒号可以不使用字符类来写。
(?<="(?:phone|email)":")[^"]+(?=")|[^@"\s]+@[^@"\s]+
说明
(?<="(?:phone|email)":")
断言的是左边或者是“手机”:“或‘电子邮件’:”[^"]+(?=")
比赛不是一个双引号,并确保有一个是在结束|
或者[^@"\s]+@[^@"\s]+
通过使用一个否定的字符类匹配不是一个双引号或匹配的email like
模式@您当前的正则表达式是试图完成太多的单一服用。你会好起来的分裂状况,并与他们分别处理。我会假设输入将始终遵循你的榜样,没有边缘的情况下的结构:
\w+@.+?(?="|\s)
- 在电子邮件,通过前面@
每个字符始终是一个单词字符,所以使用\w+@
足以捕捉到电子邮件上半年。至于下半年,我用一个通配符(.
)与惰性限定符(+?
),以尽快停止捕获,并与检查双引号或空格((?="|\s)
)积极前瞻相结合就那么同时捕获的内部"email"
和"text"
性质电子邮件。 Lookarounds are zero-length assertions,因此他们没有得到抓获。(?<="phone":")\d+
- 在这里,我只是使用前缀"phone":"
的回顾后,然后只捕获数字\d+
。结合这两个条件,你有你的正则表达式:\w+@.+?(?="|\s)|(?<="phone":")\d+
。
Regex101:https://regex101.com/r/UvDIjI/3
\b
& Alternation |
输入字符串模式具有下列报价或周围都被视为非词的目标包裹空间。所以这样的:“\b
emailPattern\b
”和这样的:space\b
emailPattern\b
space的比赛。交替给一条线两条线的电源。搜索emailPattern或phonePattern。
/(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;
(
Word边界(在左侧的非字)\b
\w+?
@
\w+?
.
\w+?
\b
|
[0-9]{10}
)
g
lobal标志继续第一场比赛后搜索。let str = `"email":"[email protected]", "phone":"1111111111", "text":"sample text may contain email [email protected] as well"`;
const rgx = /(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;
let res = str.replace(rgx, '*****');
console.log(res);