5

我编写了一个脚本来抓取 HTML 文件中的不同字段并用结果填充变量。我在获取电子邮件的正则表达式方面遇到问题。这是一些示例代码:

$txt='<p class=FillText><a name="InternetMail_P3"></a>First.Last@company-name.com</p>'

$re='.*?'+'([\\w-+]+(?:\\.[\\w-+]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7})'

if ($txt -match $re)
{
    $email1=$matches[1]
    write-host "$email1"
}

我收到以下错误:

Bad argument to operator '-match': parsing ".*?([\\w-+]+(?:\\.[\\w-+]+)*@(?:[\\w-]+\\
.)+[a-zA-Z]{2,7})([\\w-+]+(?:\\.[\\w-+]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7})" - [x-y] range in reverse order..
At line:7 char:16
+ if ($txt -match <<<<  $re)
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : BadOperatorArgument

我在这里想念什么?另外,是否有更好的电子邮件正则表达式?

提前致谢。

4

2 回答 2

11

实际上,任何适用于 .Net 或 C# 的正则表达式都适用于 PowerShell。你可以在 stackoverflow 和 inet 上找到大量的样本。例如:如何查找或验证电子邮件地址:官方标准:RFC 2822

$txt='<p class=FillText><a name="InternetMail_P3"></a>First.Last@company-name.com</p>'
$re="[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"
[regex]::MAtch($txt, $re, "IgnoreCase ")

但是这个答案还有其他部分。正则表达式本质上不太适合解析 XML/HTML。您可以在此处找到更多详细信息:使用正则表达式解析 HTML:为什么不呢?

为了提供真正的解决方案,我首先推荐

  1. 转换 HTML → XHTML
  2. 遍历 XML 树
  3. 一个一个地处理单个节点,甚至使用正则表达式。
于 2012-07-19T16:11:42.243 回答
2

在电子邮件验证方面,我通常选择 RFC 2822 的简短版本:

[a-z0-9!#$%&'*+/=?^_ {|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:a-z0-9?.)+a-z0-9?

您可以在此处找到有关电子邮件验证的更多信息

于 2012-07-19T16:12:34.160 回答