1

我需要一个正则表达式来混淆我拥有的数据库转储文件中的电子邮件。我想用一个设置的域替换所有域,@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在这种情况下找到的所有字符串,但在学术上我仍然对如何将电子邮件正则表达式的每个部分视为令牌并独立替换用户名/域感兴趣。

4

2 回答 2

7

崇高文本

SublimeText使用Boost 语法,它支持 Perl 正则表达式中相当大的功能子集。但是对于这项任务,您不需要所有这些高级构造。

以下是两种可能的方法:

  1. 如果您可以假设它@不会出现在任何其他上下文中(这对于普通文本来说是一个相当公平的假设),那么您可以只搜索域部分@[A-Z0-9.-]+\.[A-Z]{2,4}\b并替换它。

  2. 如果您(pattern)在替换字符串中使用捕获组和反向引用。

    找什么

    \b([A-Z0-9._%-]+)@[A-Z0-9.-]+\.[A-Z]{2,4}\b
    

    ([A-Z0-9._%-]+)是正则表达式中的第一个(也是唯一一个)捕获组。

    用。。。来代替

    $1@fake.com
    

    $1指第一个捕获组捕获的文本。

请注意,对于上述两种方法,您需要关闭区分大小写(表示为左下角的第二个按钮),除非您特别想删除以全部大写字母编写的电子邮件。

于 2013-04-17T22:53:21.580 回答
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
于 2013-04-17T22:52:51.047 回答