正则表达式可以识别模式。它们也可以根据确定的模式从文本中过滤出数据,因此正则表达式是用来处理源文本的一款非常优秀的工具。
例如,你想从一封邮件中过滤出一个确切的电子邮件地址,就可以使用我们之前提到过正则表达式。然后就可以在变量$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
本文链接: https://www.pstips.net/regex-finding-information-in-text.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

非常好,正是我需要的