如何在使用正则表达式替换时跳过输入中不匹配的行?
对于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
中删除第三封电子邮件时,它会毫无错误地执行。那么如何更改我的正则表达式以跳过有问题的字符串?
答案 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