Powershell .contains() 检查不区分大小写

问题描述 投票:0回答:2

我有一个更大的 foreach 循环代码,但需要在不区分大小写的情况下执行以下代码。

下面的代码片段返回 false,如何忽略区分大小写的 .contains() 并将条件设为 true?

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

期望值为真。上面的代码尝试使用 2 个变量,结果返回 false。

powershell substring string-matching
2个回答
10
投票

.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 运算符,默认情况下不区分大小写:

如果 
$a

包含通配符表达式上下文中的

元字符
,即 *
?
,以及
[
/
]
转义
它们,可以 individually` 或者更简单地说,在整个字符串中使用
[WildcardPattern]::Escape()
:
$a='aa0855'; $b='AA0855 Sample'; $b -like ('*{0}*' -f [WildcardPattern]::Escape($a)) 


如果 
$a

包含正则表达式上下文中的

元字符
字符,例如 .,则必须对它们进行
转义
,可以单独使用 \,或者更简单地,在整个字符串中使用
 [regex]::Escape()
$a='aa0855'; $b='AA0855 Sample'; $b -match [regex]::Escape($a)

或者

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

  • 选项C

    :用$a查找字符串

    $b
    中子字符串
    String.IndexOf()
    索引
    ,可以不区分大小写;返回值 
    -1
    表示
    $a
    不是 
    $b 的子串:
    $a='aa0855'; $b='AA0855 Sample'
    -1 -ne $b.IndexOf($a, [StringComparison]::InvariantCultureIgnoreCase)
    

    请注意,在这种情况下
    [StringComparison]::InvariantCultureIgnoreCase
      ,即必须使用确切参数类型的值来明确定位正确的方法重载;
    • string
       快捷方式 
      'InvariantCultureIgnoreCase' 将是不明确的。
      
      
  • 选项 D
  • 在使用(单参数,区分大小写).Contains()重载之前将两个字符串转换为小写:

    参见
    js2010的回答

  • 还有另一种方法:

4
投票

© www.soinside.com 2019 - 2024. All rights reserved.