Autohotkey RegExReplace跳过无与伦比的模式

时间:2016-03-29 09:11:43

标签: regex autohotkey

如何在使用正则表达式替换时跳过输入中不匹配的行?

对于Ex。以下是我的test.txt

的内容
elkay_iyer@yahoo.com
elkay_qwer@yahoo.com
elke engineering ltd.,@yahoo.com
elke0265@yahoo.com
elke@yahoo.com

下面是我的带有正则表达式代码的Autohotkey脚本

ReplaceEmailsRegEx := "i)([a-z0-9]+(\.*|\_*|\-*))+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}"
RemoveDuplicateCharactersRegEx := "s)(.)(?=.*\1)"

Try{
FileRead, EmailFromTxtFile, test.txt
OtherThanEmails :=RegExReplace(EmailFromTxtFile,ReplaceEmailsRegEx)
Chars :=RegExReplace(OtherThanEmails,RemoveDuplicateCharactersRegEx)
Loop{
StringReplace, OtherThanEmails, OtherThanEmails, `r`n`r`n,`r`n, UseErrorLevel
If ErrorLevel = 0
Break
}
If (StrLen(OtherThanEmails)){
Msgbox The Characters found other than email:`n%OtherThanEmails%
}
}
catch e {
ErrorString:="what: " . e.what . "file: " . e.file . " line: " . e.line . " msg: " . e.message . " extra: " . e.extra
Msgbox An Exception was thrown`n%ErrorString%
}
Return

当它替换test.txt时会抛出错误:

e.what contains 'RegExReplace', e.line is 10

当我在test.txt中删除第三封电子邮件时,它会毫无错误地执行。那么如何更改我的正则表达式以跳过有问题的字符串?

1 个答案:

答案 0 :(得分:1)

由于开头的嵌套量词,您遇到的问题是灾难性的回溯([a-z0-9]+(\.*|\_*|\-*))+。此处,由于.量词,_-*都是可选的,因此您的模式会缩减为([a-z0-9]+)+

我建议“展开”第一个子模式以使其成为线性:

i)[a-z0-9]+(?:(?:\.+|_+|-+)[a-z0-9]+)*@([a-z][-a-z0-9]+\.)+[a-z]{2,6}

i)[a-z0-9]+(?:([._-])\1*[a-z0-9]+)*@(?:[a-z][-a-z0-9]+\.)+[a-z]{2,6}

如果您在“字词”之间不允许超过1 \1*._,则甚至可以删除-

此外,在\-*中不需要使用(\.|\-*\.)替换,因为连字符与前一个字符类匹配,因此,此子模式可以缩减为\.

请参阅regex demo