gpt4 book ai didi

regex - Select-String:仅当字符串前面没有特定字符时才匹配字符串

转载 作者:行者123 更新时间:2023-12-02 00:55:04 26 4
gpt4 key购买 nike

我有一个包含两个字符串之一的文件列表:

stuff ”或“;stuff

我正在尝试编写一个 PowerShell 脚本,该脚本将仅返回包含“stuff”的文件。下面的脚本当前返回所有文件,因为显然“stuff”是“;stuff”的子字符串

对于我的生活,我无法弄清楚如何只匹配包含“stuff ”的文件,而没有前面的 ;

Get-Content "C:\temp\list\list.txt" |
Where-Object { Select-String -Quiet -Pattern "stuff" -SimpleMatch $_ }

注: C:\temp\list\list.txt包含一个文件路径列表,每个路径都传递给 Select-String .

谢谢您的帮助。

最佳答案

您无法使用文字子字符串搜索 ( -SimpleMatch ) 执行所需的匹配。

相反,使用带有否定后视断言的正则表达式 ( (?<!..) ) 排除 stuff; 开头的子串字符:(?<!;)stuff
应用于您的命令:

Get-Content "C:\temp\list\list.txt" | 
Where-Object { Select-String -Quiet -Pattern '(?<!;)stuff' -LiteralPath $_ }

正则表达式陷阱:
  • 使用 [^;]stuff 很诱人相反,使用 否定( ^ )字符集( [...] )(参见 this answer );但是,如果 stuff,这将不会按预期工作出现在一行的最开始,因为字符集 - 无论是否否定 - 只匹配实际字符,而不是行首位置。
  • 然后很想申请?到否定字符集(对于可选匹配 - 0 或 1 次出现):[^;]?stuff .但是,这将匹配包含 ;stuff 的字符串。再次,鉴于 stuff从技术上讲,前面是否定字符集的“0 重复出现”;因此,';stuff' -match '[^;]?stuff' yield $true .

  • 在这种情况下,只有后视断言才能正常工作 - 参见 regular-expressions.info .

    关于regex - Select-String:仅当字符串前面没有特定字符时才匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54931987/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com