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