Select-String:仅匹配前面没有 * 字符的字符串

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

mkl*_*nt0 5

让我用一些背景信息来补充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

  • 哇,您**真的**付出了更多的努力,只是为了确保问题得到结论性和全面的回答。您应该由 MSFT 获得报酬。 (2认同)