该字符串不是有效的正则表达式

use*_*554 2 regex powershell

我有一个包含 DNS .zone 文件的文件夹。

我试图返回所有文件和 IP 地址看起来像172.20.*.

我使用以下内容:

Get-ChildItem -Recurse -Path 'C:\Root' | Select-String -Pattern '*172.20.*' | group | select name
Run Code Online (Sandbox Code Playgroud)

但这会返回:

Select-String :字符串 *172.20.* 不是有效的正则表达式:解析 "*172.20.*" - 量词 {x,y} 不接任何内容。

我尝试-SimpleMatch在我的案例中使用这个案例Select-String但没有成功。将字符串括在双引号中也不起作用。

如果我使用实际文本作为我的模式,它可以毫无问题地工作。

我的问题在哪里?

Ans*_*ers 5

就像错误消息说的那样:*172.20.*不是有效的正则表达式。这是一个通配符模式,可以与-like运算符一起使用,但不能与Select-String. *在正则表达式中是一个不能独立存在的修饰符,它需要一些它适用的东西。相当于通配符*(匹配零个或多个字符)的正则表达式是.*。但由于正则表达式(与通配符模式不同)在默认情况下不是锚定的,因此您无需在模式的开头和结尾添加它们以使匹配起作用。

要么将您的表达式更改为实际的正则表达式:

... | Select-String -Pattern '172\.20\.' | ...
Run Code Online (Sandbox Code Playgroud)

或修改您的代码以使用通配符匹配而不是正则表达式匹配:

Get-ChildItem -Recurse  -Path 'C:\Root' | Where-Object {
    Get-Content $_.FullName | Where-Object { $_ -like '*172.20.*' }
} | Select-Object -Expand Name
Run Code Online (Sandbox Code Playgroud)

使用-SimpleMatch对您的方法不起作用,因为-Pattern '*172.20.*' -SimpleMatch会寻找文字(子)字符串*172.20.*(带星号),该字符串可能不存在于您的文件中。如果您从模式中删除通配符,它​​会起作用:

... | Select-String -Pattern '172.20.' -SimpleMatch | ...
Run Code Online (Sandbox Code Playgroud)