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