Regex 要匹配和不匹配的正则表达式
我正在使用powershell,希望使用正则表达式来匹配某些内容。我有一个具有此命名约定的服务器列表-Regex 要匹配和不匹配的正则表达式,regex,powershell,Regex,Powershell,我正在使用powershell,希望使用正则表达式来匹配某些内容。我有一个具有此命名约定的服务器列表-ABCPPsomename 因此,当正则表达式在名称中找到PP时,我希望它包含在内 但是,有些服务器的名称为abcprodsomenapame,匹配项包括这些服务器,因为名称中包含App 我需要它,如果PP在名称中包含它,如果它不在名称中则将其删除。 此外,我还需要包含ABCPPsomeAppname的服务器名称如果(大如果,因为您对此不清楚)所有服务器的名称都以文本ABC开头,那么是的,这并不
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
如果子字符串只应在某个位置匹配,则需要进行更多的工作
注:
- 上面的命令直接对输入数组进行操作,并返回过滤后的数组
- 如果要通过管道进行过滤,请参阅
听起来像是要匹配包含子字符串
PP
的服务器名称,区分大小写,以便PP
匹配,但App
不匹配
对于区分大小写的匹配,请使用-cmatch
运算符:
PS> 'PPOnly', 'OnlyApp', 'PPandApp', 'Neither' -cmatch 'PP'
PPOnly
PPandApp
如果子字符串只应在某个位置匹配,则需要进行更多的工作
注:
- 上面的命令直接对输入数组进行操作,并返回过滤后的数组
- 如果要通过管道进行过滤,请参阅
-cmatch
。另外,有关在数组文本上删除@(..)
的提示。这是一个很难改掉的习惯。谢谢,西奥。了解再习惯;我还可以看到使用@(…)
的视觉吸引力,在v5.1+中,您不再需要支付性能罚款。然而,我的投票支持更少的字符。传播,
本身就足以构建数组。谢谢你的帮助。不过它不区分大小写,你能给我举个例子吗?不区分大小写的话,它可以用。@RussellMaycock:我明白了。看来西奥的最新答案可能有解决办法。如果你真的只想忽略App
匹配项,即如果pp
前面有a
,你可以使用:'ABCPPsomeAppName','ABCPRODsomeAppname'-match'(?+1表示-cmatch
。还有关于删除@(..)的提示
关于数组文字。这是一个很难打破的习惯。谢谢,@Theo。我理解了你的习惯;我也能看到使用@(…)的视觉吸引力
,并且在v5.1+中,您不再需要支付性能惩罚。但是,我的投票结果是减少字符数。并且散布这样一个词:,
本身就足以构造数组。感谢您的帮助。虽然它不区分大小写,但您能否给我一个不区分大小写的示例。@RussellMaycock:我明白了。看来西奥的更新答案可能有解决办法。如果你真的只想忽略App
匹配项,也就是说,如果你想忽略pp
,如果前面有a
,你可以使用:'ABCPPsomeAppName',ABCPRODsomeAppname'-match'(?是的,有一个命名约定,但工程师没有遵守,这是问题的一部分。有些机器一开始有四、五个字符。是的,有一个命名约定,但工程师没有遵守i