正则表达式捕获上次电子邮件地址

时间:2017-12-07 17:37:56

标签: regex exchange-server

我需要一个正则表达式来捕获最后的电子邮件地址

  

2017-11-30T17:00:02.596Z,10.1.20.211,RenjuXXX,XXXX,mxa-0003fe01.xx.renjj.com ,; 250 2.0.0 2ej1k6mass-1消息接受发送; ClientSubmitTime :, Outbound to互联网,SMTP,发送,asadasdasd1212,,b4b8c0b5-ce3b-4aca-8335-08d53813c96a,Jose.renj @ renj.org,250 2.1.5收件人好,41758,1 ,,, RE:我的简历,renjujacob @ renju.com ,renjujacob @ renju.com,

我尝试使用下面的这个正则表达式捕获电子邮件ID,但它捕获了第一个email

  ?

((P(小于?=,)[α-ZA-Z0-9- ] + @ [A-ZA-Z0-9 - ] +(= \ S *(?:\ W + = |))))

需要正则表达式来捕获最后的电子邮件ID(renjujacob@re​​nju.com)。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻:

[^,\s@]++@[^,\s@]++(?![^@]*@)

<小时/> 细分,这说:

[^,\s@]++    # NOT comma nor whitespace nor @, 1+ times, possessive
@            # @ literally
[^,\s@]++    # same as above
(?![^@]*@)   # a neg. lookahead, making sure there's no @ to follow

a demo on regex101.com

<小时/> 另一种方法是通过

获取所有电子邮件地址
[^,\s@]++@[^,\s@]++

并选择编程语言中的最后一项(例如results[-1]中的Python)。

编辑:

感谢@Andrei改善模式。

答案 1 :(得分:0)

.*((?<=,)[a-zA-Z0-9-.]+@[a-zA-Z0-9-.]+(?=\s*(?:\w+=|,)))

。*匹配任何字符(行终止符除外)

  • 量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)[这种贪婪允许返回组1的最后一次发生]

第一捕获组((?&lt; =,)[a-zA-Z0-9 - 。] + @ [a-zA-Z0-9 - 。] +(?= \ s *(?:\ w + = |,))):

正面观察(?&lt; =,)

断言下面的正则表达式匹配

,匹配字符,字面意思(区分大小写)

匹配下面列表中的单个字符[a-zA-Z0-9 - 。] +

  • 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

a-z a(索引97)和z(索引122)之间的单个字符(区分大小写)

A-Z A(索引65)和Z(索引90)范围内的单个字符(区分大小写)

0-9 0(索引48)和9(索引57)范围内的单个字符(区分大小写)

- 匹配列表中的单个字符 - 。 (区分大小写)

@匹配字符@字面(区分大小写)

匹配下面列表中的单个字符[a-zA-Z0-9 - 。] +:

  • 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

a-z a(索引97)和z(索引122)之间的单个字符(区分大小写)

A-Z A(索引65)和Z(索引90)范围内的单个字符(区分大小写)

0-9 0(索引48)和9(索引57)范围内的单个字符(区分大小写)

- 匹配列表中的单个字符 - 。 (区分大小写) 正向前瞻(?= \ s *(?:\ w + = |,))

断言下面的正则表达式匹配:

\ s *匹配任何空白字符(等于[\ r \ n \ t \ f \ v])

非捕获组(?:\ w + = |,)

全局模式标记 g修饰符:全局。所有比赛(第一场比赛后不返回)

https://regex101.com/r/nWgDSy/1

答案 2 :(得分:0)

正则表达式

@

在括号内捕获倒数第二个逗号分隔字段中的电子邮件地址,但没有很多(通常是错误的)关于电子邮件地址可以包含或不包含的假设 - 我们只需要一个import {CapitalizationStyle} from "Utils/CapitalizationStyle"; 并排除逗号因为格式是逗号分隔的,但就是它。