我有一个更大的 foreach 循环代码,但需要在不区分大小写的情况下执行以下代码。
下面的代码片段返回 false,如何忽略区分大小写的 .contains() 并将条件设为 true?
$a='aa0855'
$b='AA0855 Sample'
$b.Contains($a)
期望值为真。上面的代码尝试使用 2 个变量,结果返回 false。
.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 运算符默认使用的值相同,即文化中立的大小写不敏感比较(即在不变文化的上下文中执行)。
Windows PowerShell 中,您有两个选项,使用 PowerShell 运算符,默认情况下不区分大小写:
-like
,基于通配符:
$a='aa0855'; $b='AA0855 Sample'; $b -like "*$a*"
如果
$a
包含通配符表达式上下文中的
元字符,即
*
和 ?
,以及 [
/ ]
、转义它们,可以 individually 和
`
或者更简单地说,在整个字符串中使用 [WildcardPattern]::Escape()
:$a='aa0855'; $b='AA0855 Sample'; $b -like ('*{0}*' -f [WildcardPattern]::Escape($a))
-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:
:用$a
查找字符串
$b
中子字符串String.IndexOf()
的索引,可以不区分大小写;返回值
-1
表示 $a
不是
$b
的子串:
$a='aa0855'; $b='AA0855 Sample'
-1 -ne $b.IndexOf($a, [StringComparison]::InvariantCultureIgnoreCase)
请注意,在这种情况下
[StringComparison]::InvariantCultureIgnoreCase
快捷方式
'InvariantCultureIgnoreCase'
将是不明确的。
在使用(单参数,区分大小写).Contains()
重载之前将两个字符串转换为小写:
参见js2010的回答。