PowerShell正则表达式(四)在文本中搜索信息 1


正则表达式可以识别模式。它们也可以根据确定的模式从文本中过滤出数据,因此正则表达式是用来处理源文本的一款非常优秀的工具。

例如,你想从一封邮件中过滤出一个确切的电子邮件地址,就可以使用我们之前提到过正则表达式。然后就可以在变量$matches找出返回的结果。在你使用-match操作符时,$matches变量会自动被创建,并存储过滤出的结果。$matches是一个哈希表,你既可以输出一个完整的哈希表,也可以使用在中括号中的名称(键值)逐个访问其中的某个元素。

如果文本中有多个电子邮件,上面的方法还会有效吗?非常遗憾,它不会这样做。操作符-match只会匹配一次正则表达式。因此如果你想在源文本中搜索多个出现的模式,你必须切换至RegEx对象,值得一提的是RegEx对象不像-match,Regex对象默认是大小写敏感的,你要想大小写不敏感,可以参考前面的文章。

# 源文本中有两个电子邮件地址,-match只能匹配到一个
$rawtext = "test@pstips.net sent an e-mail that was forwarded to admin@pstips.net."
$rawtext -match "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
True
$matches

Name                           Value
----                           -----
0                              test@pstips.net

# regex 对象可以匹配所有出现的电子邮箱地址,默认大小写敏感
$regex = [regex]"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
$regex.Matches($rawtext)

Groups   : {test@pstips.net}
Success  : True
Captures : {test@pstips.net}
Index    : 0
Length   : 15
Value    : test@pstips.net

Groups   : {admin@pstips.net}
Success  : True
Captures : {admin@pstips.net}
Index    : 53
Length   : 16
Value    : admin@pstips.net

#限制,只输出电子邮箱地址
$regex.Matches($rawtext) | Select-Object -Property Value

Value
-----
test@pstips.net
admin@pstips.net

#继续处理电子邮箱地址
$regex.Matches($rawtext) | ForEach-Object { "found: $($_.Value)" }
found: test@pstips.net
found: admin@pstips.net

英文原始链接:http://powershell.com/cs/blogs/ebookv2/archive/2012/03/20/chapter-13-text-and-regular-expressions.aspx

本文链接: https://www.pstips.net/regex-finding-information-in-text.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

一条评论 “PowerShell正则表达式(四)在文本中搜索信息