正则表达式电子邮件:提取具有多个点的域

时间:2015-07-15 02:12:14

标签: regex powershell

我有这个电子邮件地址john@domain.com.ch和john@domain.org。我正在使用这个正则表达式模式:

$pattern="(?ms)@(.*?)\."

并且只设法为john@domain.org提取“域名”但不提取john@domain.com.ch。请帮助我如何从两个电子邮件地址获取“域名”。谢谢。

2 个答案:

答案 0 :(得分:2)

如果您的文本中有其他@符号(如推文句柄),则存在缺陷,但保持简单,您可以匹配@之后的所有内容直到第一个空格。考虑以下培根ipsum

  

培根ipsum dolor amet火腿hock肩熏牛肉火腿andouille   fatback john@domain.com.ch 法兰克福黑莓猪肉。 Picanha猪   法兰克福香肠,地面圆柄prosciutto doner侧翼。 Alcatra doner   鸡肉猪排肩,肥胖火鸡香肠侧面picanha。    john@domain.org

     

肉饼短腰pancetta火鸡。

     

臀部牛腩肉丸,肩部@地面圆形干咸肉排骨   kielbasa排骨鸡肉capicola侧翼鼓槌。下巴牛短   loin pastrami biltong菲力牛排臀部猪排capicola alcatra。

运行正则表达式@([^\s]+)将获得结果(来自第一个捕获组)

domain.com.ch
domain.org

如果上述文本是变量$text中的原始字符串,则以下行将生成

$text | Select-String "@([^\s]+)" -AllMatches | Select-Object -Expand matches | Select-Object -Expand Value

控制台上的输出

@domain.com.ch
@domain.org

你可以使用look backs来省略@但是在后期处理中更容易删除它然后在这里使用后面的效率低效。或者,如果您不介意额外的代码,我们也可以使用此处存在的捕获组

Select-String "@([^\s]+)" -AllMatches | 
      Select-Object -ExpandProperty Matches | 
      Select-Object Groups | 
      ForEach{$_.Groups[1]} | 
      Select-Object -ExpandProperty Value

返回的每个匹配对象都有2个组。第一个是整个捕获,第一个是我们的捕获组。

如果您想对匹配更关键,可以使用@([a-z1-9\.-]+) 我认为只允许接受的域名字符(减去TLD中允许的几个Unicode字符)。如果您过滤掉没有句点的匹配,那么您将被设置。

答案 1 :(得分:0)

匹配到(1 - 2) (1 - 3) (2 - 1) (2 - 3) (3 - 1) (3 - 2) 之后的第一个点:

@

顺便说一句,你的选择对我来说并不是很有意义。为什么需要(?ms)@([^.]+) (多行)和m(单行)选项?