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

Eld*_*.Ob 2 regex powershell regex-negation regex-lookarounds

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

这是我到目前为止得到的:

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

这有效,但我也得到了更新,例如:Windows Internet Explorer 9 Language Pack for Windows 7 for x64-based Systems

但我也想获得以下语法的更新:[Language] Language Pack eg Finnish Language Pack

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

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

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

你有什么想法吗?

格雷茨·埃尔多

Wik*_*żew 6

您可以使用

(?<!^(?:German|English(?:\s+\(United States\))?)\s*)Language Pack
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

它匹配Language Pack,如果它之前没有用GermanEnglishEnglish (United States)在字符串的开始。

细节

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