PowerShell正则表达式(六)组


一串原始的文本行通常有大量有用信息,你可以使用子表达式来收集数据,可以在之后单独使用。基本的规则是所有想通过模式来搜索的数据应当放在圆括号中,因为变量$matches会将这些子表达式以单独的序列返回。如果文本行首先包含了数据,然后是其它文本,两者之间以制表符分割,你可以如下描述这段模式:

# 定义模式: 由Tab分割的两个字符串
$pattern = "(.*)\t(.*)"
# 生成一个由Tab分割的字符串
$line = "12/01/2009`tDescription"
# 使用正则表达式匹配:
$line -match $pattern
#True
# 显示结果:
$matches
<#
 # Name Value
 #---- -----
 #2 Description
 #1 12/01/2009
 #0 12/01/2009 Description
#>

$matches[1]
#12/01/2009
$matches[2]
#Description

当使用子表达式时,$matches会包含所有搜索模式,数组的第一个元素命名为“0”,子表达式分别位于两个圆括号中,为了使他们更加便于读取理解,你可以分配给每个子表达式它们自己的名子(键),接下来通过它们去调用匹配的结果。给子表达式命名,可以在圆括号中输入type ?

# 给子表达式命名:
$pattern = "(?<Date>.*)\t(?<Text>.*)"
# 生成包含Tab键的字符串
$line = "12/01/2009`tDescription"
# 使用正则表达式匹配:
$line -match $pattern
#True
# 显示结果:
$matches
<#
 # 
 #Name Value
 #---- -----
 #Text Description
 #Date 12/01/2009
 #0 12/01/2009 Description
#>

$matches.Date
#12/01/2009
$matches.Text
#Description

每个子表达式检索的结果都需要存储空间,如果特定场合中不需要这些结果可以,可以丢弃它们,因为这样可以提高正则表达式匹配的速度。要丢弃结果,可以在子表达式中的第一个语句上加上“?:”

# 第二个子表达式不返回结果:
$pattern = "(?<Date>.*)\t(?:.*)"
# 生成包含制表符的字符串:
$line = "12/01/2009`tDescription"
# 使用正则表达式匹配:
$line -match $pattern
#True
# 第二个子表达式没有多余的结果返回
$matches
<#
 # 
 #Name Value
 #---- -----
 #Date 12/01/2009
 #0 12/01/2009 Description
#>

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

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

关于 Mooser Lee

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

发表评论

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