我有以下正则表达式
/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i
要验证电子邮件,我还必须验证电子邮件不包含“没有”一词并且表达式是/^((?!notiene).)*$
,但是我不能将两者混合使用。
我有以下正则表达式
/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i
要验证电子邮件,我还必须验证电子邮件不包含“没有”一词并且表达式是/^((?!notiene).)*$
,但是我不能将两者混合使用。
问题。您使用的负前瞻从文本的开头开始,只要它们后面没有跟随,就会消耗每个字符
notiene
这意味着当您尝试验证邮件时,它已经在文本的末尾找到。也就是说,
.*
该模式之一已经消耗了所有字符,而不允许验证更多字符。解决方案。另一方面,如果从文本的开头验证它,但没有消耗任何字符,则可以验证多个子模式:
检查尝试匹配子模式,匹配后,光标从尝试检查之前所在的相同位置继续。它可以被认为是一个只返回真/假的构造,但正则表达式的其余部分可以继续,就好像什么都没发生一样(当然,如果它返回真)。
^(?!.*notiene)
我们确保遍历整条线。如果.*notiene
它不匹配,作为一个否定检查,那么它就像它返回“ true ”,但我们仍然在文本的开头(没有消耗任何字符),我们可以从那里检查任何其他模式。完整的正则表达式:(使用Validate an email in JavaScript的答案)
示范:
整体情况
对于我们在文本开头锚定 2 个正则表达式的任何情况(是的,它们必须从头开始匹配),让它们成为
^re1
and^re2
,检查两者的方法是:或者,就像您的情况一样,第一个不匹配,但第二个匹配:
例如,连接 3 个表达式:大写字母,不以“1234”结尾,以及 8 到 200 个字符。