[英]Extract a substring from value of key-value pair using regex
我在日志中有一个字符串,我想屏蔽基于正则表达式的值。
例如 :
"email":"testEmail@test.com", "phone":"1111111111", "text":"sample text may contain email testEmail@test.com as well"
正则表达式应该掩盖
所需输出 :
"email":"*****", "phone":"*****", "text":"sample text may contain email ***** as well"
我已经能够做的是分别屏蔽电子邮件和电话,而不是在“文本”后面的字符串中显示的电子邮件ID。
正则表达式到目前为止已发展 :
(?<=\"(?:email|phone)\"[:])(\")([^\"]*)(\")
由于您没有通过不匹配双引号来匹配第一部分中的电子邮件地址,因此可以通过不匹配双引号来匹配文本中的电子邮件地址。
一种做到这一点的方法可能是使用环视和轮换来进行匹配。 然后将匹配项替换为*****
请注意,您不必转义双引号,并且不使用字符类就可以编写冒号。
(?<="(?:phone|email)":")[^"]+(?=")|[^@"\s]+@[^@"\s]+
说明
(?<="(?:phone|email)":")
断言左侧是” phone“:”或“ email”:“ [^"]+(?=")
不匹配双引号,并确保末尾有一个双引号 |
要么 [^@"\\s]+@[^@"\\s]+
通过使用否定的字符类匹配而不是双引号或@来匹配email like
模式的email like
\\b
和交替|
输入字符串模式在目标周围包含引号或空格,它们都被视为非单词。 所以这个:“ \\b
emailPattern \\b
”和这个: 空格 \\b
emailPattern \\b
空格是匹配的。 交替给一条线带来两行的幂。 搜索emailPattern 或 phonePattern 。
/(\\b\\w+?@\\w+?\\.\\w+?\\b|[0-9]{10})/g;
(
单词边界(左侧为非单词) \\b
\\w+?
@
\\w+?
.
\\w+?
\\b
|
[0-9]{10}
)
g
lobal标志在第一次匹配后继续搜索。 let str = `"email":"testEmail@test.com", "phone":"1111111111", "text":"sample text may contain email testEmail@test.com as well"`; const rgx = /(\\b\\w+?@\\w+?\\.\\w+?\\b|[0-9]{10})/g; let res = str.replace(rgx, '*****'); console.log(res);
您当前的RegEx试图一次完成太多任务。 您最好分割条件并分别处理。 我假设输入将始终遵循您的示例的结构,没有极端情况:
\\w+@.+?(?="|\\s)
-在电子邮件中, @
前面的每个字符始终是单词字符,因此使用\\w+@
足以捕获电子邮件的前半部分。 ,我使用了带有懒惰量词( +?
)的通配符( .
)来尽快停止捕获,并将其与检查双引号或空格( (?="|\\s)
)的正向超前组合起来,以便捕获"email"
和"text"
属性中的"email"
。 环视是零长度的断言 ,因此不会被捕获。 (?<="phone":")\\d+
-在这里,我只是在后面使用前缀"phone":"
,然后只捕获数字\\d+
。 结合两个条件,您将获得RegEx: \\w+@.+?(?="|\\s)|(?<="phone":")\\d+
。
Regex101: https ://regex101.com/r/UvDIjI/3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.