正则表达式 - 匹配,如果不在X,Y和Z中

时间:2013-03-27 19:50:33

标签: regex email lookahead

我想匹配字符串中的邮件地址。那没问题。但由于任何原因,我无法排除特殊的html标签和属性。

我的邮件正则表达式:

[!#\$%&'\*\+\-\/0-9=\?a-z\^_`\{\}\|~]*(?:\\[\x00-\x7F][!#\$%&'\*\+\-\/0-9=\?a-z\^_`\{\}\|~]*)*(?:\.[!#\$%&'\*\+\-\/0-9=\?a-z\^_`\{\}\|~]*(?:\\[\x00-\x7F][!#\$%&'\*\+\-\/0-9=\?a-z\^_`\{\}\|~]*)*)*@[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\.[a-z]{2,}

现在,如果邮件地址在输入字段中,我不想匹配:

<input type="xxx" value"foo@bar.tld">

我也不想匹配,如果它在标题标签中

<title>foo@bar.tld

也不包含在<style<script

我尝试了这个向前看的东西,但我制作了非法的正则表达式,或者它只是不起作用。

1 个答案:

答案 0 :(得分:0)

一个正则表达式无法以您想要的方式同时排除和包含。

如果您的目标文档是格式良好的XML,那么您可以使用一个或多个正则表达式来查找和替换带有空字符串的标记,然后使用您的工作正则表达式查找剩余文本中的邮件地址。

但是,我必须同意Bohemian的观点,如果您的目标是XML文件,那么XML解析器是最好的方法。 XML是复杂而灵活的,在设计替换空字符串正则表达式(例如CDATA和注释块)时,始终存在使用您忘记的功能的文件的风险。最好坚持使用一个解析器,该解析器经过设计和测试,可以运行XML并逐个提取文档。

如果您的目标文档是XML解析器无法读取的不守规矩的HTML,那么您可能必须尝试使用​​replace-then-search方法。