使用负向先行断言的regexp_replace清理电子邮件地址

3

我在Postgres中使用regexp_replace来清理一些雅虎邮箱地址。

SELECT regexp_replace(domain,'yahoo\.co[^\.].*','yahoo.com')  FROM table  

很遗憾,此表达式匹配了我不想匹配的类型 yahoo.com.tw 。我希望正则表达式不匹配以下内容:
yahoo.es
yahoo.co.jp
yahoo.com.tw  

MATCH:

yahoo.com,
yahoo.com.
yahoo.com'

我已经做了几个小时并查看了stackoverflow中的几个链接,例如: 正则表达式匹配不包含某个单词的行?

它们帮助我编写了一个负向先行断言,但似乎无法将其与yahoo部分结合起来。

负向先行断言

     ^(?!.*(\.com?\.|\.[a-z]{2})).*$    

这里是regex101的数据和公式。
如有建议,将不胜感激。谢谢。

yahoo.es 应该匹配吗? - HTNW
1个回答

2

这个模式匹配的是在你的雅虎“REPLACE”部分下面的所有内容,而不匹配上面的任何好的情况:

^yahoo\.com?(?:(?!\.[a-z]{2}).)*(?:.com?)?$

演示

其他类似于yahool.com的情况可以作为可选匹配项添加,如下所示:

^yahoo\.com?(?:(?!\.[a-z]{2}).)*(?:.com?)?$|^yahoo$|^yahool\.com|^yahooo\.com|^yahoo\.net|^yahoocom$

等等。然而,有些可以很容易地被归为一组。


非常有帮助,谢谢。第二个非捕获组是做什么的?即这个:(?:.com?)?$ - moonshot
1
合法的问题。它处理了特殊情况:yahoo.com21yahoo.com,在yahoo.com之后还有另一个.com。 - wp78de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接