PowerShell正则表达式(七)深入使用子表达式 1


借住子表达式的帮助,你可以创建出更加惊人和灵活的正则表达式。例如,怎样定义一个网站中HTML标签的模式呢?一个标签通常包含同样的结构:<tagname [parameter]>…</tagname>,这就意味着可以快速定义出一个非常严格的HTML标签模式:

"<body background=1>www.pstips.net</body>" -match "<body\b[^>]*>(.*?)</body>"
$matches[1]
#True
#www.pstips.net

模式以固定的文本”<body “开始,额外的字符以单词为界。接下来跟着右括号”>”,”>”之后则是中的内容,这些内容可以由任意数量的字符(.*?)组成。圆括号中是一个子表达式,会在$matches中返回检索到的中的结果。结尾的部分为固定文本 “”)开始,另外一次以(“”)终结。如果一个正则表达式支持处理任意标签,那它必须能够自动地找出所有的标签,并且在前后两个位置都能使用。怎样完成它呢?像这样:

"<body background=2>Contents</body>" -match "<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>"
#True
$Matches
<#
 # Name                           Value
 # ----                           -----
 # 2                              Contents
 # 1                              body
 # 0	<body background=2>Contents</body>
#>

上面的正则表达式不在包含预定义的固定HTMl 标签,却能匹配所有的HTML标签。它是如何办到的呢?因为初始标签被定义成子表达式,该子表达式以字母开始,可以由任意字母或数字组成。
([A-Z][A-Z0-9]*)
在开始匹配到的标签必须在之后也能迭代匹配到,就是要有头也得有尾,善始善终。此处你会发现引入了一个新写法””,“\1”引用的是第一个子表达式。这样就保证了HTMl标签开始的和结尾的一致了。

$regexTag = [regex]"(?i)<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>"
$result = $regexTag.Matches("<button>Press here</button>")
$result[0].Groups[2].Value + " is in tag " + $result[0].Groups[1].Value 
<#
 # Press here is in tag button 
#>
本文链接: https://www.pstips.net/regex-using-sub-expression.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

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

发表评论

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

一条评论 “PowerShell正则表达式(七)深入使用子表达式