Powershell RegEx 在字符串开头匹配负向后看

Powershell RegEx match negative lookbehind at start of string

我目前正在研究 WSUS 更新自动化,我想获取所有不以“(德语|英语)语言包”开头的更新。

这是我目前得到的:

[regex]$reg = "(?<!German|English|English \(United States\)) Language Pack"
$LanguagePacks = $updates.Where({ $_.Title -match $reg })

这行得通,但我也收到了如下更新: Windows Internet Explorer 9 语言包 Windows 7 for x64-based Systems

但我也想通过以下语法获取更新: [语言] 语言包芬兰语语言包

所以我尝试使用'^'锚点来确定字符串的开始

[regex]$reg = "^(?<!German|English|English \(United States\)) Language Pack"
$LanguagePacks = $updates.Where({ $_.Title -match $reg })

但在这种情况下,结果是空的:(

你有想法吗?

问候 Eldo.O

您可以使用

(?<!^(?:German|English(?:\s+\(United States\))?)\s*)Language Pack

regex demo

如果字符串开头没有GermanEnglishEnglish (United States),则匹配Language Pack

详情

  • (?<! - 如果在当前位置的左侧立即有模式,则匹配失败的否定后视开始:
    • ^ - 字符串开头
    • (?: - 交替非捕获组的开始:
      • German - 文字子串
      • | - 或
      • English - 文字子串
      • (?:\s+\(United States\))? - 一个可选的非捕获组匹配 1 次或 0 次出现的:
        • \s+ - 1 个或多个空格
        • \(United States\) - 文字 (United States) 子串
    • ) - 交替组结束
    • \s* - 0+ 个空格
  • ) - 回顾结束
  • Language Pack - 文字子串