我在日志中有一个字符串,我想基于正则表达式屏蔽值。
例如:
"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)\"[:])(\")([^\"]*)(\")
答案 0 :(得分:1)
由于您没有通过不匹配双引号来匹配第一部分中的电子邮件地址,因此可以通过不匹配双引号来匹配文本中的电子邮件地址。
执行此操作的一种方法可能是使用环视效果和alternation获得匹配项。然后将匹配项替换为*****
请注意,您不必转义双引号,无需使用字符类就可以编写冒号。
(?<="(?:phone|email)":")[^"]+(?=")|[^@"\s]+@[^@"\s]+
说明
(?<="(?:phone|email)":")
声明左侧的内容是“电话”:”或“电子邮件”:” [^"]+(?=")
不能匹配双引号,并确保结尾处有一个|
或[^@"\s]+@[^@"\s]+
通过使用否定的字符类匹配而不是双引号或@ email like
模式
请参见regex demo
答案 1 :(得分:0)
\b
和Alternation |
输入字符串模式在目标周围都带有引号或空格,它们都被视为非单词。因此,这是“ \b
emailPattern \b
”,而这是: space \b
emailPattern {{1 }} space 是匹配项。交替给一条线带来两行的幂。搜索 emailPattern OR phonePattern 。
\b
/(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;
单词边界(左侧的非单词)(
\b
\w+?
@
\w+?
.
\w+?
\b
|
[0-9]{10}
)
大叶标志在第一次比赛后继续搜索。
g
答案 2 :(得分:0)
您当前的RegEx试图一次完成太多任务。您最好分割条件并分别处理。我假设输入将始终遵循示例的结构,没有边缘情况:
\w+@.+?(?="|\s)
-在电子邮件中,每个以@
开头的字符始终是单词字符,因此使用\w+@
就足以捕获电子邮件的前半部分。至于后半部分,我使用了带有惰性量词(.
)的通配符(+?
)来尽快停止捕获,并将其与检查双引号或空格的正向超前组合起来((?="|\s)
),以便同时捕获"email"
和"text"
属性中的电子邮件。 Lookarounds are zero-length assertions,因此不会被捕获。(?<="phone":")\d+
-在这里,我只是在后面使用前缀"phone":"
,然后仅捕获数字\d+
。同时合并两个条件,您就可以使用RegEx:\w+@.+?(?="|\s)|(?<="phone":")\d+
。
Regex101: https://regex101.com/r/UvDIjI/3