如何从regex电子邮件模式中排除图像?

如何从regex电子邮件模式中排除图像?,regex,go,Regex,Go,我正在使用这个正则表达式:\b[A-Za-z0-9.\uz%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b,我是从中找到的 但是,它会产生图像,如175x100@3x.jpg将被视为电子邮件 我做了一些搜索,发现我可以利用负前瞻,但GoLang regexp包不提供此功能。是否有其他可供我使用的正则表达式模式?您可以匹配希望忽略的任何扩展,然后匹配并捕获TLD模式。如果组1值不为空,则获取匹配项,否则放弃: package main import ( "fmt

我正在使用这个正则表达式:
\b[A-Za-z0-9.\uz%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b
,我是从中找到的

但是,它会产生图像,如175x100@3x.jpg将被视为电子邮件


我做了一些搜索,发现我可以利用负前瞻,但GoLang regexp包不提供此功能。是否有其他可供我使用的正则表达式模式?

您可以匹配希望忽略的任何扩展,然后匹配并捕获TLD模式。如果组1值不为空,则获取匹配项,否则放弃:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    s := ` 175x100@3x.jpg and  175x100@3x.com`
    rex := regexp.MustCompile(`\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.(?:jpe?g|([A-Za-z]{2,6}))\b`)
    results := rex.FindAllStringSubmatch(s, -1)
    for _, match := range results  {
        if len(match[1]) > 0 {
          fmt.Printf("%q\n", match[0])
        }
    }
}
看。输出:
175x100@3x.com


这里,
(?:jpe?g|([A-Za-z]{2,6}))
模式匹配
jpg
jpeg
,并匹配并捕获到组1中的任意两到六个ASCII字母
if len(match[1])>0{fmt.Printf(“%q\n”,match[0])}
part仅在组1匹配时打印匹配。

关于
175x100@3x.jpg
?因为它以
\d+x\d+@
开头,或者因为它以
.jpg
结尾?你尝试过什么负面展望?当然,它在Go正则表达式中不起作用,但它可能会让你明白你到底想做什么,因为它以
.jpg
结尾。如果是
175x175@email.com
那我就没问题了。所以,有两种方法。或者检查以
.jpg
结尾的所有匹配项,如果匹配,则丢弃它们。或者使用带有替换项的正则表达式,如
\b(?[a-Za-z0-9.[uz%+-]+@[a-Za-z0-9.-]+\.jpe?g |([a-Za-z0-9.[u%+-]+@[a-Za-z0-9.-+\[a-Za-z]{2,6}))\b
并只收集存在的第1组值。这是有效的电子邮件。您还有一个问题..jpg在语法上是一个有效的域扩展。有朝一日,它可能会成为一个可注册的。