我有这个电子邮件地址john@domain.com.ch和john@domain.org。我正在使用这个正则表达式模式:
$pattern="(?ms)@(.*?)\."
并且只设法为john@domain.org提取“域名”但不提取john@domain.com.ch。请帮助我如何从两个电子邮件地址获取“域名”。谢谢。
答案 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
(单行)选项?