Notepad ++和正则表达式删除不匹配的部分

时间:2017-12-08 22:10:01

标签: regex replace notepad++

我正在使用我制作的正则字符串...

['"]{1}\w+@\w+\.{1}\w\w\w?['"]

寻找旧格式错误的旧文件中的引号中包含的电子邮件地址。

示例:

 ADF325@#%jkdaf-@#%j-afd(#$w52'leroyjenkins@myguild.edu'@#%kladfjkla-235dsaf-'thisemail@example.com'2l35jk2dz-dl1jkozf-afajelj'gooselick@somebodyspastries.co'l2#%Jk23l5jlafafljewo8972509357
j2k3l5jadfjeljwfoobar'foobar@barfoo.foo'jk23j-zv8902354jlfa
('352lj53k2ljkumquat'fakeemail@realemail.wtf')lajflsdf
etc.

正则表达式对我来说很漂亮......除了一件事。我想替换那些与空格匹配的内容,以便我可以将其格式化以将其迁移到正确的数据库。如何删除不匹配的所有内容(最好在每次匹配之间抛出换行符)?

2 个答案:

答案 0 :(得分:2)

使用

['"](\w+@\w+\.\w{2,3})['"]|(?s).

并替换为(?{1}\1\n)

相当快一点(demo):

['"](\w+@\w+\.\w{2,3})['"]|[^'"]*(?:['"](?!\w+@\w+\.\w{2,3}['"])[^'"]*)*

<强>详情

  • ['"] - 引用
  • (\w+@\w+\.\w{2,3}) - 第1组:1 +字字符,@,1 +字字符,.,然后是2或3个字符
  • ['"] - 引用
  • | - 或
  • (?s). - 任何一个字符。

如果组1匹配((?{1}),则匹配将替换为组1内容(\1\n)。如果(?s).匹配,则匹配将被删除。

enter image description here

答案 1 :(得分:1)

当你必须处理大文件时,处理它们的方法包括不完全加载它们。相反,您必须将它们作为流读取。你不能使用npp来做到这一点,但可以使用像php这样的脚本语言。 如果要在将文件作为流加载时进行更改或提取某些内容,可以编写用户定义的流过滤器:

class EmailFilter extends php_user_filter
{
    public function filter($in, $out, &$consumed, $closing)
    {
        while ( $bucket = stream_bucket_make_writeable($in) ) {
            if ( preg_match_all('~\'\K\w+@\w+\.\w{2,3}(?=\')|"\K\w+@\w+\.\w{2,3}(?=")~S', $bucket->data, $matches) ) {
                 $bucket->data = implode("\n", $matches[0]);    
            }
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

stream_filter_register('email_filter', 'EmailFilter');
$handle = fopen('php://filter/read=email_filter/resource=yourfile.txt', 'rb');

while (feof($handle) !== true) {
    echo fgets($handle); 
}

fclose($handle);

当你采用这种方法时,没有什么禁止在你的表中五到五,十乘十,二十到二十或你想要的数字插入邮件。目标是不将所有文件加载到内存中。

(O'Reilly Modern PHP中的更多示例)