根据正则表达式的规则,读者可能会怀疑在上一篇匹配HTML标签时,使用的事“.*?”而不是简单的“.*”。毕竟“.*”已经可以匹配足够的字符了。“.*”和“.*?”之间的不同并不容易识别。下面通过一个例子来澄清。
假设你要再一个长文件中匹配英文月份,但是月份并不是以同样的方式出现的。有时使用短格式,有时使用长格式。正如接下来看见的一样,正则表达式完成可以做到。因为正则表达式支持子表达式以可选的形式出现。
"Feb" -match "Feb(ruary)?" #True $matches[0] #Feb "February" -match "Feb(ruary)?" #True $matches[0] #February
上面两种情况正则表达式都能识别月份,但是返回的结果却不相同,一个是Feb,一个是February。默认,正则表达式属于“贪婪”模式。在搜索到Feb后会继续贪婪地搜索更多符合模式的的字符。如果可以整个文本会返回。
然后,如果你主要关心的只是规范的月份名称,你可能更喜欢获取缩写的月份名称。这也正是“??”限定符做的,它会将正则表达式转换成“非贪婪”模式,一旦他识别到一个模式,就会立即返回,不再会检查可选的子表达式是否匹配。
"Feb" -match "Feb(ruary)??" #True $matches[0] #Feb "February" -match "Feb(ruary)??" #True $matches[0] #Feb
到底限定符“??”和之前的例子中的限定符“*?”有什么联系呢?事实上“*?”不是一个独立量词。它会将“贪婪”模式转换成“非贪婪”模式。这就意味着,你可以使用“?”强制将限定符“*”转换成非贪婪模式,尽可能返回短结果。这也正是之前在匹配HTML标签时所做的。接下来你会看到假如没有“非贪婪”模式,正则表达式会尽可能检索更多的内容,也自然会出错。
# 贪婪限定符 * 会尽可能多的匹配结果: "Contents" -match "<body\b[^>]*>(.*)" #True $matches[1] #Contents<\body> #非贪婪限定符*?, 尽可能短的返回匹配结果 "Contents" -match "<body\b[^>]*>(.*?)" #True $matches[1] #Contents
根据正则表达式中的定义,HTML标签中可以匹配任意字符,而且必须以””作结,贪婪限定符会跨过第一次出现的继续匹配。但是非贪婪限定符则会在第一次匹配到结束。
本文链接: https://www.pstips.net/regex-lazy-and-greedy-match.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
什么事自足式量词?
非常感谢,当时翻译时欠妥,应当翻译成独立量词,已更正。独立量词:(a self-contained quantifier)
最后一个例子好像是错的
是的,内容不完整
对于如下,
Enter value of
Enter
select-string -pattern ‘Enter\s{1}value\s{1}of’
如何能只匹配第一行,上面写法会把两个都匹配上,求指导?
Select-String 更适合在字符串数组(集合中)过滤字符串。
比如你的
到底是一个字符串,还是2个字符串组成的数组。
如果数组,肯定没问题:
如果不是数组,你可以按照换行符把它分割成数组
但是这时候更推荐使用春正则表达式匹配: