我需要一个正则表达式来混淆我拥有的数据库转储文件中的电子邮件。我想用@fake.com
等设置域替换所有域名,因此我不会冒险在开发过程中向真人发送电子邮件。电子邮件必须是唯一的,以匹配数据库约束,所以我只想替换域并保留用户名。
我目前有这个正则表达式来查找电子邮件
\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
如何将此搜索正则表达式转换为可在Sublime Text或SED或Vim中的查找和替换操作中使用的正则表达式?
修改
请注意,我刚刚意识到在这种情况下我可以替换@[A-Z0-9.-]+\.[A-Z]{2,4}\b
找到的所有字符串,但在学术上我仍然对如何将电子邮件正则表达式的每个部分视为令牌并替换用户名感兴趣/域独立。
答案 0 :(得分:7)
<强> SublimeText 强>
SublimeText使用Boost syntax,它支持Perl正则表达式中相当多的功能。但是对于这项任务,您不需要所有这些高级构造。
以下是两种可能的方法:
如果您可以假设@
没有出现在任何其他上下文中(这对于普通文本来说是相当公平的假设),那么您只需搜索域部分@[A-Z0-9.-]+\.[A-Z]{2,4}\b
并替换它。
如果您在替换字符串中使用捕获组(pattern)
和反向引用。
查找内容
\b([A-Z0-9._%-]+)@[A-Z0-9.-]+\.[A-Z]{2,4}\b
([A-Z0-9._%-]+)
是正则表达式中的第一个(也是唯一的)捕获组。
替换为
$1@fake.com
$1
是指第一个捕获组捕获的文本。
请注意,对于上述两种方法,您需要关闭区分大小写(表示为左下角的第二个按钮),除非您特别要删除所有大写的电子邮件。
答案 1 :(得分:1)
您可以对Vim使用以下命令:
:%s/\(\<[A-Za-z0-9._%-]\+@\)[A-Za-z0-9.-]\+\.[A-Za-z]\{2,4}\>/\1fake.com/g
\(
和\)
之间的所有内容都将成为一个群组,该群组将被群组的转义号码(在这种情况下为\1
)所取代。我还修改了正则表达式以匹配小写字母并具有与Vim兼容的语法。
此外,您可以通过将\c
放在正则表达式中的任何位置来关闭区分大小写:
:%s/\c\(\<[A-Z0-9._%-]\+@\)[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/\1fake.com/g
另请注意,该行开头的%
要求Vim在整个文件中进行替换,并在最后g
在同一行中进行多次替换。
另一种方法是使用零宽度匹配(\@<=
):
:%s/\c\(\<[A-Z0-9._%-]\+@\)\@<=[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/fake.com/g