Fry*_*ryc 4 regex powershell negative-lookbehind select-string
我在 Powershell 脚本中有这一行:
if (Select-String -Path "$holidays" -Pattern "(?<!\*)$datestr" -SimpleMatch -Quiet)
$holidays 是一个文本文件,其中我有一些日期:
2023-09-04
2023-11-23
*2023-11-24
2023-12-25
Run Code Online (Sandbox Code Playgroud)
$datestr 是今天日期:2023-11-23
为什么负向后看模式在上面的行中不起作用?
我只是想排除(不匹配)所有以 * 开头的日期
我认为负向回顾中有问题,因为该行:
if (Select-String -Path "$holidays" -Pattern $datestr -SimpleMatch -Quiet)
Run Code Online (Sandbox Code Playgroud)
工作完美 --> 结果是正确的
第一行结果为 false
让我用一些背景信息来补充Santiago Squarzon 的有用答案:
Select-String默认情况下将其-Pattern参数解释为正则表达式 。
仅当您需要文字子字符串匹配时才需要-SimpleMatch。
无论哪种情况,默认情况下匹配都是不区分大小写的(PowerShell 通常都是如此);
-CaseSensitive根据需要使用。
-SimpleMatch不要与这些其他开关混淆- 这些开关与参数是否-Pattern被解释为正则表达式或文字字符串无关:
-Raw- 仅在PowerShell (Core) 7+中可用-按原样发出匹配的输入字符串(行) ,而不是报告包装在实例中的默认行为,这会使用有关匹配的元数据Microsoft.PowerShell.Commands.MatchInfo补充匹配的输入字符串。
-AllMatches(与-Raw和不兼容-SimpleMatch)要求在每个输入字符串(行)上查找模式的所有匹配项,而不仅仅是第一个。
注意:仅-Raw发出字符串,因此根据定义,无法报告有关每个字符串的哪些部分匹配的信息;同样,-SimpleMatch不记录此类信息,即使有多个 -Pattern参数可能令人感兴趣;另外,不幸的是,从 v7.4.0 开始,结合-SimpleMatch被-AllMatches悄悄接受,即使-AllMatches没有效果- 请参阅GitHub 问题 #11091
对象.Matches的属性正是为了支持对象的集合。如果没有后者,该集合就只有一个条目。MatchInfoSystem.Text.RegularExpressions.Match-AllMatches.Matches
-List一旦找到匹配的字符串,就会停止处理进一步的输入字符串,并仅针对该输入MatchInfo输出一个实例(或[string]具有 的实例-Raw),即每个输入文件最多一个- 这可能是一项重要的性能改进。
-Quiet其行为类似于-List,只不过MatchInfo它不是发出实例$true,而是发出 ,即找到匹配项的抽象指示符。
$false找到匹配项就会发出该消息,但从 PowerShell (Core) 7.4.0 开始,情况并非如此;相反,没有输出;请参阅GitHub 问题#16681。
也就是说,在隐含的布尔上下文中,没有输出等于- 请参阅概念性about_Booleans帮助主题$false| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |