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

时间:2019-01-28 16:58:28

标签: regex powershell

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

我正在尝试返回IP地址类似于172.20.*的所有文件和字符串。

我使用以下内容:

Get-ChildItem -Recurse -Path 'C:\Root' | Select-String -Pattern '*172.20.*' | group | select name

但这返回:

  

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

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

如果我使用实际文本作为样式,则它可以正常工作。

我的问题在哪里?

1 个答案:

答案 0 :(得分:3)

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

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

... | Select-String -Pattern '172\.20\.' | ...

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

Get-ChildItem -Recurse  -Path 'C:\Root' | Where-Object {
    Get-Content $_.FullName | Where-Object { $_ -like '*172.20.*' }
} | Select-Object -Expand Name

使用-SimpleMatch不适用于您的方法,因为-Pattern '*172.20.*' -SimpleMatch会查找文字(子)字符串*172.20.*(带有星号),该字符串可能不存在您的文件。如果您从模式中删除了通配符,那将是可行的:

... | Select-String -Pattern '172.20.' -SimpleMatch | ...