繁体   English   中英

使用正则表达式从键值对的值中提取子字符串

[英]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"

正则表达式应该掩盖

  1. 电子邮件值-包含在“电子邮件”和“文本”之后的字符串中
  2. 电话号码

所需输出

"email":"*****", "phone":"*****", "text":"sample text may contain email ***** as well"

我已经能够做的是分别屏蔽电子邮件和电话,而不是在“文本”后面的字符串中显示的电子邮件ID。

正则表达式到目前为止已发展

(?<=\"(?:email|phone)\"[:])(\")([^\"]*)(\")

https://regex101.com/r/UvDIjI/2/

由于您没有通过不匹配双引号来匹配第一部分中的电子邮件地址,因此可以通过不匹配双引号来匹配文本中的电子邮件地址。

一种做到这一点的方法可能是使用环视和轮换来进行匹配。 然后将匹配项替换为*****

请注意,您不必转义双引号,并且不使用字符类就可以编写冒号。

(?<="(?: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
  • OR |
  • 10个连续数字[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试图一次完成太多任务。 您最好分割条件并分别处理。 我假设输入将始终遵循您的示例的结构,没有极端情况:

  1. 电子邮件:
    • \\w+@.+?(?="|\\s) -在电子邮件中, @前面的每个字符始终是单词字符,因此使用\\w+@足以捕获电子邮件的前半部分。 ,我使用了带有懒惰量词( +? )的通配符( . )来尽快停止捕获,并将其与检查双引号或空格( (?="|\\s) )的正向超前组合起来,以便捕获"email""text"属性中的"email" 环视是零长度的断言 ,因此不会被捕获。
  2. 电话号码:
    • (?<="phone":")\\d+ -在这里,我只是在后面使用前缀"phone":" ,然后只捕获数字\\d+

结合两个条件,您将获得RegEx: \\w+@.+?(?="|\\s)|(?<="phone":")\\d+

Regex101: https ://regex101.com/r/UvDIjI/3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM