从使用正则表达式的元序列字边界\ b交替键 - 值对值抽取子|

问题描述 投票:0回答:3

我在日志中的字符串,我想掩盖基于正则表达式的值。

例如:

"email":"[email protected]", "phone":"1111111111", "text":"sample text may contain email [email protected] as well"

正则表达式应该掩盖

  1. 电子邮件价值 - 无论是里面的字符串“电子邮件”和“文本”后,
  2. 电话号码

所需的输出:

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

我已经能够做的是“文本”后,以掩盖电子邮件和电话的个体,但不存在这样的字符串内的电子邮件ID。

正则表达式发展至今:

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

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

regex lookbehind
3个回答
1
投票

当你不通过匹配不是一个双引号匹配在第一部分的电子邮件地址,你可以通过还不能匹配一个双引号匹配文本的电子邮件地址。

要做到这一点的一种方法是让使用lookarounds和alternation比赛。然后更换*****比赛

请注意,您不必逃避双引号和冒号可以不使用字符类来写。

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

说明

  • (?<="(?:phone|email)":")断言的是左边或者是“手机”:“或‘电子邮件’:”
  • [^"]+(?=")比赛不是一个双引号,并确保有一个是在结束
  • |或者
  • [^@"\s]+@[^@"\s]+通过使用一个否定的字符类匹配不是一个双引号或匹配的email like模式@

regex demo


0
投票

您当前的正则表达式是试图完成太多的单一服用。你会好起来的分裂状况,并与他们分别处理。我会假设输入将始终遵循你的榜样,没有边缘的情况下的结构:

  1. 电子邮件: \w+@.+?(?="|\s) - 在电子邮件,通过前面@每个字符始终是一个单词字符,所以使用\w+@足以捕捉到电子邮件上半年。至于下半年,我用一个通配符(.)与惰性限定符(+?),以尽快停止捕获,并与检查双引号或空格((?="|\s))积极前瞻相结合就那么同时捕获的内部"email""text"性质电子邮件。 Lookarounds are zero-length assertions,因此他们没有得到抓获。
  2. 电话号码: (?<="phone":")\d+ - 在这里,我只是使用前缀"phone":"的回顾后,然后只捕获数字\d+

结合这两个条件,你有你的正则表达式:\w+@.+?(?="|\s)|(?<="phone":")\d+

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


0
投票

Meta Sequence Word Boundary \b & Alternation |

输入字符串模式具有下列报价或周围都被视为非词的目标包裹空间。所以这样的:“\bemailPattern\b”和这样的:space\bemailPattern\bspace的比赛。交替给一条线两条线的电源。搜索emailPattern或phonePattern。

/(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;
  • (Word边界(在左侧的非字)\b
  • 一个或多个单词字符\w+?
  • 文字@
  • 一个或多个单词字符\w+?
  • 转义文字.
  • 一个或多个单词字符\w+?
  • 字边界(右边一个不字)\b
  • OR |
  • 连续10个号码[0-9]{10} )
  • global标志继续第一场比赛后搜索。

演示

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);
© www.soinside.com 2019 - 2024. All rights reserved.