我正在使用我制作的正则字符串...
['"]{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.
正则表达式对我来说很漂亮......除了一件事。我想替换那些与空格匹配的内容,以便我可以将其格式化以将其迁移到正确的数据库。如何删除不匹配的所有内容(最好在每次匹配之间抛出换行符)?
答案 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).
匹配,则匹配将被删除。
答案 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中的更多示例)