借住子表达式的帮助,你可以创建出更加惊人和灵活的正则表达式。例如,怎样定义一个网站中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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
写的极好,希望以后多多写出短小精悍的文章来。