我有一个更大的Foreach循环代码,但需要在不区分大小写的情况下执行下面的代码。下面的代码片段返回FALSE,我怎么能忽略区分大小写的.CONTAINS()和条件为TRUE?
$a='aa0855' $b='AA0855 Sample' $b.Contains($a)
期望值为真。用2个变量尝试上面的代码,它返回FALSE。
imzjd6km1#
.Contains().NET字符串方法确实区分大小写--在Windows PowerShell中总是如此,在PowerShell(Core)7+**中默认情况下也是如此。
.Contains()
因此,在*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*运算符,默认情况下不区分大小写:
StringComparison
InvariantCultureIgnoreCase
-like
$a='aa0855'; $b='AA0855 Sample'; $b -like "*$a*"
如果$a在通配符表达式上下文中包含元字符的字符,即*和?,以及[/],则转义它们,或者单独使用```,或者更简单地,在整个字符串中使用[WildcardPattern]::Escape():
$a
*
?
[
]
[WildcardPattern]::Escape()
$a='aa0855'; $b='AA0855 Sample'; $b -like ('*{0}*' -f [WildcardPattern]::Escape($a))
-match
$a='aa0855'; $b='AA0855 Sample'; $b -match $a
如果$a在正则表达式的上下文中包含元字符的字符,例如.,则必须对它们进行转义,或者单独使用\,或者更简单地,使用[regex]::Escape()在整个字符串中进行转义:
.
\
[regex]::Escape()
$a='aa0855'; $b='AA0855 Sample'; $b -match [regex]::Escape($a)
或者,使用Windows PowerShell中也提供的不同/其他.NET API**:
String.IndexOf()
$b
-1
$a='aa0855'; $b='AA0855 Sample' -1 -ne $b.IndexOf($a, [StringComparison]::InvariantCultureIgnoreCase)
[StringComparison]::InvariantCultureIgnoreCase
'InvariantCultureIgnoreCase'
rvpgvaaj2#
这里有另一种方法:
$a='aa0855'; $b='AA0855 Sample'; $b.ToLower().Contains($a.ToLower()) True
2条答案
按热度按时间imzjd6km1#
.Contains()
.NET字符串方法确实区分大小写--在Windows PowerShell中总是如此,在PowerShell(Core)7+**中默认情况下也是如此。因此,在*PowerShell(Core)7+*中,您可以:
第二个
.Contains()
参数被转换为StringComparison
类型的枚举值;InvariantCultureIgnoreCase
与PowerShell的运算符默认使用的值相同,即不区分大小写的比较(即在invariant culture的上下文中执行)。在Windows PowerShell中,您有两个选项,使用PowerShell*运算符,默认情况下不区分大小写:
-like
,基于wildcard:如果
$a
在通配符表达式上下文中包含元字符的字符,即*
和?
,以及[
/]
,则转义它们,或者单独使用```,或者更简单地,在整个字符串中使用[WildcardPattern]::Escape()
:-match
,基于regex:如果
$a
在正则表达式的上下文中包含元字符的字符,例如.
,则必须对它们进行转义,或者单独使用\
,或者更简单地,使用[regex]::Escape()
在整个字符串中进行转义:或者,使用Windows PowerShell中也提供的不同/其他.NET API**:
String.IndexOf()
在$b
字符串中查找$a
子串的index,可以不区分大小写;返回值-1
表示$a
不是$b
的子串:[StringComparison]::InvariantCultureIgnoreCase
,即必须使用精确参数类型的值来明确地指向正确的方法重载;字符串快捷方式'InvariantCultureIgnoreCase'
将是不明确的。.Contains()
重载之前,将两个字符串都转换为小写:rvpgvaaj2#
这里有另一种方法: