【问题标题】:regex email : extract domain with multiple dot正则表达式电子邮件:提取具有多个点的域
【发布时间】:2015-10-03 21:38:00
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否可以选择在 @ 上使用拆分并直接获取第二部分?
  • 可能是(?ms)@(.*?)(?:\s|$)?这将捕获 @ 之后的所有内容,直到空格或字符串结尾。
  • 试过了。但结果只为 .org.thx 生成了“域”

标签: regex powershell


【解决方案1】:

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

培根 ipsum dolor amet 火腿飞节肩熏牛肉火腿 andouille fatback john@domain.com.ch 法兰克福肋眼猪肉。皮卡尼亚猪 法兰克福香肠,磨圆柄意大利熏火腿侧面。阿尔加特拉岛 鸡猪排肩,肥背火鸡香肠侧翼 picanha。 john@domain.org

肉饼短腰烟肉火鸡。

牛腩肉丸,肩部@地面圆形干牛肉排骨 基尔巴萨排骨鸡 capicola 侧翼鼓槌。下颌牛短 里脊肉熏牛肉干肉片菲力牛排臀部猪排 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 behinds 来省略@,但在后期处理中删除它比使用look behinds 更容易。或者,如果您不介意额外的代码,我们也可以使用此处存在的捕获组

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

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

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

【讨论】:

    【解决方案2】:

    匹配到@之后的第一个点:

    (?ms)@([^.]+)
    

    顺便说一句,你的选择对我来说没有多大意义。为什么需要m(多行)和s(单行)选项?

    【讨论】:

    • 它是 Outlook $msg.to 中的多个电子邮件地址。我尝试提取每个电子邮件地址中的域,以便我可以根据提取的域对其进行处理。感谢您的想法和建议。但我仍然无法从以多个点结尾的电子邮件地址中获取域,例如“.co.uk”
    猜你喜欢
    • 2018-12-04
    • 2011-01-16
    • 1970-01-01
    • 2020-12-10
    • 2022-01-26
    • 2020-07-10
    • 1970-01-01
    • 2017-09-25
    • 2021-11-24
    相关资源
    最近更新 更多