正则表达式匹配和不匹配

时间:2018-12-05 15:26:54

标签: regex powershell

我正在使用Powershell,并且想使用正则表达式来匹配某些东西。我有一个具有此命名约定的服务器列表-ABCPPsomename
因此,当正则表达式在名称中找到PP时,我希望它包含在内。

但是,某些服务器的名称为ABCPRODsomenAppame,并且由于名称中的App,匹配项包括这些服务器。

我需要它,所以如果PP是包含它的名称,并且不是它的名称,则不包含它。 另外,我需要包含ABCPPsomeAppname的服务器名称

2 个答案:

答案 0 :(得分:1)

IF(如果您对此不太清楚,则表示 if 为大),所有服务器的名称均以文字文本ABC开头,那么是的,这并不难:< / p>

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

结果

ABCPPsomename
ABCPPsomeAppname


更新
根据您的最新评论,我认为服务器名称约定应以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

希望有帮助

答案 1 :(得分:1)

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


听起来您想匹配包含 substring PP 区分大小写的服务器名称,以便PP匹配,但是{{ 1}}不会。

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

-cmatch

如果子字符串只能在某个位置匹配,则需要做更多的工作。

注意:

  • 上面的命令直接在输入 array 上操作,并返回过滤后的数组。

  • 如果要通过管道进行过滤,请参见Theo's Where-Object-based answer