不区分大小写的PowerShell.containes()检查

zazmityj  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(201)

我有一个更大的Foreach循环代码,但需要在不区分大小写的情况下执行下面的代码。
下面的代码片段返回FALSE,我怎么能忽略区分大小写的.CONTAINS()和条件为TRUE?

$a='aa0855'
$b='AA0855 Sample'
$b.Contains($a)

期望值为真。用2个变量尝试上面的代码,它返回FALSE。

imzjd6km

imzjd6km1#

.Contains().NET字符串方法确实区分大小写--在Windows PowerShell总是如此,在PowerShell(Core)7+**中默认情况下也是如此。

因此,在*PowerShell(Core)7+*中,您可以:


# PS 7+ only

# -> $true

$a='aa0855'; $b='AA0855 Sample'; $b.Contains($a, 'InvariantCultureIgnoreCase')

第二个.Contains()参数被转换为StringComparison类型的枚举值;InvariantCultureIgnoreCase与PowerShell的运算符默认使用的值相同,即不区分大小写的比较(即在invariant culture的上下文中执行)。
Windows PowerShell中,您有两个选项,使用PowerShell*运算符,默认情况下不区分大小写:

  • 选项A**:使用-like,基于wildcard
$a='aa0855'; $b='AA0855 Sample'; $b -like "*$a*"

如果$a在通配符表达式上下文中包含元字符的字符,即*?,以及[/],则转义它们,或者单独使用```,或者更简单地,在整个字符串中使用[WildcardPattern]::Escape()

$a='aa0855'; $b='AA0855 Sample'; $b -like ('*{0}*' -f [WildcardPattern]::Escape($a))
  • 选项B**:使用-match,基于regex
$a='aa0855'; $b='AA0855 Sample'; $b -match $a

如果$a在正则表达式的上下文中包含元字符的字符,例如.,则必须对它们进行转义,或者单独使用\,或者更简单地,使用[regex]::Escape()在整个字符串中进行转义:

$a='aa0855'; $b='AA0855 Sample'; $b -match [regex]::Escape($a)

或者,使用Windows PowerShell中也提供的不同/其他.NET API**:

  • 选项C**:使用String.IndexOf()$b字符串中查找$a子串的index,可以不区分大小写;返回值-1表示$a不是$b的子串:
$a='aa0855'; $b='AA0855 Sample'
-1 -ne $b.IndexOf($a, [StringComparison]::InvariantCultureIgnoreCase)
  • 请注意,在这种情况下,[StringComparison]::InvariantCultureIgnoreCase,即必须使用精确参数类型的值来明确地指向正确的方法重载;字符串快捷方式'InvariantCultureIgnoreCase'将是不明确的。
  • 选项D**:*在使用(单参数,区分大小写).Contains()重载之前,将两个字符串都转换为小写
  • js2010's answer
rvpgvaaj

rvpgvaaj2#

这里有另一种方法:

$a='aa0855'; $b='AA0855 Sample'; $b.ToLower().Contains($a.ToLower())

True

相关问题