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

时间:2019-02-06 19:27:58

标签: regex lookbehind

我在日志中有一个字符串,我想基于正则表达式屏蔽值。

例如

"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/

3 个答案:

答案 0 :(得分:1)

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

执行此操作的一种方法可能是使用环视效果和alternation获得匹配项。然后将匹配项替换为*****

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

(?<="(?:phone|email)":")[^"]+(?=")|[^@"\s]+@[^@"\s]+

说明

  • (?<="(?:phone|email)":")声明左侧的内容是“电话”:”或“电子邮件”:”
  • [^"]+(?=")不能匹配双引号,并确保结尾处有一个
  • |
  • [^@"\s]+@[^@"\s]+通过使用否定的字符类匹配而不是双引号或@
  • 来匹配email like模式

请参见regex demo

答案 1 :(得分:0)

Meta Sequence Word Boundary \bAlternation |

输入字符串模式在目标周围都带有引号或空格,它们都被视为非单词。因此,这是“ \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
  • 10个连续数字| [0-9]{10}
  • )大叶标志在第一次比赛后继续搜索。

演示

g

答案 2 :(得分:0)

您当前的RegEx试图一次完成太多任务。您最好分割条件并分别处理。我假设输入将始终遵循示例的结构,没有边缘情况:

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

同时合并两个条件,您就可以使用RegEx:\w+@.+?(?="|\s)|(?<="phone":")\d+

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