Regex Powershell选择字符串根据匹配数返回不同的值

Regex Powershell选择字符串根据匹配数返回不同的值,regex,powershell,select-string,Regex,Powershell,Select String,我有一个生成的报告文件,其中包含各种文件引用。 我使用Select字符串和正则表达式来匹配某些类型的文件,并对它们执行后续处理 我面临的困境是,当存在零(0)、一(1)或多个(2+)匹配项时,试图一致地确定匹配项的数量。以下是我尝试过的: (select-string -path $outputfilePath -pattern $regex -allmatches).matches.count 如果有0个匹配项,则返回“null”;如果有一个匹配项,则返回“1”;如果有多个匹配项,则返回“n

我有一个生成的报告文件,其中包含各种文件引用。 我使用Select字符串和正则表达式来匹配某些类型的文件,并对它们执行后续处理

我面临的困境是,当存在零(0)、一(1)或多个(2+)匹配项时,试图一致地确定匹配项的数量。以下是我尝试过的:

(select-string -path $outputfilePath -pattern $regex -allmatches).matches.count
如果有0个匹配项,则返回“null”;如果有一个匹配项,则返回“1”;如果有多个匹配项,则返回“null”

(select-string -path $outputfilePath -pattern $regex -allmatches).count
如果有0或1个匹配项,则返回“null”,如果有多个匹配项,则返回匹配数

(select-string -path $outputfilePath -pattern $regex -allmatches).count

我是Powershell的新手,但我正在尝试找到一种一致的方法来测试匹配数,而不管匹配数是0、1还是多于1。

尝试以下方法:

$content = Get-Content $outputfilePath
($content -match $regex).Count
Powershell提供了许多可能会让您的生活更轻松的功能。下面是一个快速列表:

-eq
-ne
-gt
-ge   
-lt
-le
-Like
-NotLike
-Match
-NotMatch
-Contains
-NotContains
-In
-NotIn
-Replace
在本例中,
-Match
将根据正则表达式$regex匹配$content字符串,并且输出按括号分组。此分组是字符串的集合。然后,我们可以对对象进行计数,并打印出精确的匹配计数

那么,为什么您的代码不能按预期工作呢?当您只有一个匹配项时,
.Matches
实际上返回一个类似于字符串“test123”的对象:

为什么会发生这种情况?因为对象是
Select String
返回的对象。您可以通过在单个匹配输出上尝试一些其他属性(如
.Filename
)来验证这一点

好吧,但是为什么我们不能一次完成所有的比赛呢?这是因为多个匹配项将返回多个对象,所以现在您有了一个要操作的集合。集合的类型不同,不理解
。匹配项。在1个匹配项上不返回集合,而是返回一个确实理解
。匹配项
的单个对象

长话短说:这些不是你想要的产出

您可以使用始终将结果放置在具有
计数的集合中:

(选择字符串…)#可能返回$null、一个匹配项或一组匹配项
(选择字符串…)。计数#仅在两个或多个匹配中成功
@(选择字符串…)#始终返回匹配项的集合
@(选择字符串…)。计数总是成功

您能发布导致这种不一致行为的示例数据吗?我只是想在这里发表我的意见,因为我不能与标志竞争,但我不同意针对此主题进行迁移。这里发生的不仅仅是选择字符串的行为——问题涉及到对集合和一些.NET类的细化。这对两者都是合适的,但它有足够的编程环境,因此,根据这些元帖子:,。@HyperAnthony-我收回了我的“迁移”投票。你是对的-这个问题的要点似乎在这个网站的范围内。@Cyborgx37谢谢,如果我在这里和Meta上都显得过于敌对或防御,我深表歉意。在我继续收集有关powershell相关主题中标记(和站点范围)的反馈时,我会记住您的评论。