Regex 要匹配和不匹配的正则表达式

Regex 要匹配和不匹配的正则表达式,regex,powershell,Regex,Powershell,我正在使用powershell,希望使用正则表达式来匹配某些内容。我有一个具有此命名约定的服务器列表-ABCPPsomename 因此,当正则表达式在名称中找到PP时,我希望它包含在内 但是,有些服务器的名称为abcprodsomenapame,匹配项包括这些服务器,因为名称中包含App 我需要它,如果PP在名称中包含它,如果它不在名称中则将其删除。 此外,我还需要包含ABCPPsomeAppname的服务器名称如果(大如果,因为您对此不清楚)所有服务器的名称都以文本ABC开头,那么是的,这并不

我正在使用powershell,希望使用正则表达式来匹配某些内容。我有一个具有此命名约定的服务器列表-
ABCPPsomename

因此,当正则表达式在名称中找到
PP
时,我希望它包含在内

但是,有些服务器的名称为
abcprodsomenapame
,匹配项包括这些服务器,因为名称中包含
App

我需要它,如果
PP
在名称中包含它,如果它不在名称中则将其删除。 此外,我还需要包含
ABCPPsomeAppname
的服务器名称

如果(大如果,因为您对此不清楚)所有服务器的名称都以文本
ABC
开头,那么是的,这并不难做到:

$servers = @('ABCPPsomename', 'ABCPRODsomenAppame', 'ABCPPsomeAppname')
$servers | Where-Object { $_ -match '^ABCPP' }
结果

ABCPPsomename
ABCPPsomeAppname

更新
从您最近的评论中,我推断servername约定应该以3到最多5个字符开头,后跟
PP
或完全不同的内容,如
PROD

要仅查找列表中的
“PP”
服务器,您可以尝试以下操作:

$servers = 'ABCPPsomename', 'ABCPRODsomenAppame', 'ABCPPsomeAppname'
$servers | Where-Object { $_ -match '^[A-Z]{3,5}PP' }
结果:

ABCPPsomename
ABCPPsomeAppname
正则表达式详细信息:

^          Assert position at the beginning of the string
[A-Z]      Match a single character in the range between “A” and “Z”
   {3,5}   Between 3 and 5 times, as many times as possible, giving back as needed (greedy)
PP         Match the characters “PP” literally
如果需要区分大小写的匹配,请使用
-cmatch

希望这对您有所帮助

如果(因为您不清楚这一点)您的所有服务器的名称都以文本ABC开始,那么是的,这并不难做到:

$servers = @('ABCPPsomename', 'ABCPRODsomenAppame', 'ABCPPsomeAppname')
$servers | Where-Object { $_ -match '^ABCPP' }
结果

ABCPPsomename
ABCPPsomeAppname

更新
从您最近的评论中,我推断servername约定应该以3到最多5个字符开头,后跟
PP
或完全不同的内容,如
PROD

要仅查找列表中的
“PP”
服务器,您可以尝试以下操作:

$servers = 'ABCPPsomename', 'ABCPRODsomenAppame', 'ABCPPsomeAppname'
$servers | Where-Object { $_ -match '^[A-Z]{3,5}PP' }
结果:

ABCPPsomename
ABCPPsomeAppname
正则表达式详细信息:

^          Assert position at the beginning of the string
[A-Z]      Match a single character in the range between “A” and “Z”
   {3,5}   Between 3 and 5 times, as many times as possible, giving back as needed (greedy)
PP         Match the characters “PP” literally
如果需要区分大小写的匹配,请使用
-cmatch


希望这会有所帮助。

注意:这个答案显示了如何区分大小写,而这并不是OP想要的


听起来像是要匹配包含子字符串
PP
的服务器名称,区分大小写,以便
PP
匹配,但
App
不匹配

对于区分大小写的匹配,请使用
-cmatch
运算符:

PS> 'PPOnly', 'OnlyApp', 'PPandApp', 'Neither' -cmatch 'PP'
PPOnly
PPandApp
如果子字符串只应在某个位置匹配,则需要进行更多的工作

注:

  • 上面的命令直接对输入数组进行操作,并返回过滤后的数组

  • 如果要通过管道进行过滤,请参阅


注意:这个答案显示了如何区分大小写,而这并不是OP想要的


听起来像是要匹配包含子字符串
PP
的服务器名称,区分大小写,以便
PP
匹配,但
App
不匹配

对于区分大小写的匹配,请使用
-cmatch
运算符:

PS> 'PPOnly', 'OnlyApp', 'PPandApp', 'Neither' -cmatch 'PP'
PPOnly
PPandApp
如果子字符串只应在某个位置匹配,则需要进行更多的工作

注:

  • 上面的命令直接对输入数组进行操作,并返回过滤后的数组

  • 如果要通过管道进行过滤,请参阅


您至少尝试过我们可以帮助您的东西吗?您如何知道abcprodsomenapame不匹配,而ABCPPsomename匹配?是PP的位置还是文本的大小写?需要建立规则,以使解决方案完美地适用于AAPPsomenameI等边缘案例。我添加了新的代码,可能更适用于您的案例。您至少尝试过我们可以帮助您的东西吗?您如何知道abcprodsomenapame不匹配,而ABCPPsomename匹配?是PP的位置还是文本的大小写?需要建立规则,以使解决方案完美地适用于AAPPsomenameI等边缘情况。我添加了新代码,可能更适用于您的情况。+1适用于
-cmatch
。另外,有关在数组文本上删除
@(..)
的提示。这是一个很难改掉的习惯。谢谢,西奥。了解再习惯;我还可以看到使用
@(…)
的视觉吸引力,在v5.1+中,您不再需要支付性能罚款。然而,我的投票支持更少的字符。传播
本身就足以构建数组。谢谢你的帮助。不过它不区分大小写,你能给我举个例子吗?不区分大小写的话,它可以用。@RussellMaycock:我明白了。看来西奥的最新答案可能有解决办法。如果你真的只想忽略
App
匹配项,即如果
pp
前面有
a
,你可以使用:
'ABCPPsomeAppName','ABCPRODsomeAppname'-match'(?+1表示
-cmatch
。还有关于删除
@(..)的提示
关于数组文字。这是一个很难打破的习惯。谢谢,@Theo。我理解了你的习惯;我也能看到使用
@(…)的视觉吸引力
,并且在v5.1+中,您不再需要支付性能惩罚。但是,我的投票结果是减少字符数。并且散布这样一个词:
本身就足以构造数组。感谢您的帮助。虽然它不区分大小写,但您能否给我一个不区分大小写的示例。@RussellMaycock:我明白了。看来西奥的更新答案可能有解决办法。如果你真的只想忽略
App
匹配项,也就是说,如果你想忽略
pp
,如果前面有
a
,你可以使用:
'ABCPPsomeAppName',ABCPRODsomeAppname'-match'(?是的,有一个命名约定,但工程师没有遵守,这是问题的一部分。有些机器一开始有四、五个字符。是的,有一个命名约定,但工程师没有遵守i