PowerShell和-contains运算符

tnw*_*tnw 117 powershell operators

请考虑以下代码段:

"12-18" -Contains "-"
Run Code Online (Sandbox Code Playgroud)

你认为这会评估true,但事实并非如此.这将评估false相反.我不确定为什么会这样,但确实如此.

为避免这种情况,您可以使用此代码:

"12-18".Contains("-")
Run Code Online (Sandbox Code Playgroud)

现在表达式将评估为true.

为什么第一个代码片段的行为如此?有什么特别的东西-不能很好地搭配-Contains吗?该文档没有提及任何相关内容.

Kev*_*Kev 166

-Contains运营商没有做串比较和匹配必须是一个完整的字符串,用于搜索集合.

从您链接到的文档:

-Contains描述:遏制操作员.判断参考值集合是否包含单个测试值.

在您提供的示例中,您正在使用仅包含一个字符串项的集合.

如果您阅读链接到的文档,您将看到一个演示此行为的示例:

例子:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match
Run Code Online (Sandbox Code Playgroud)

我想你想要的是-Match运营商:

"12-18" -Match "-"
Run Code Online (Sandbox Code Playgroud)

哪个回报True.

  • 为了完整性,虽然-Match可能是一个很好的匹配,它使用正则表达式.如果想要一个明确的字符串包含检查,那么应该按照OP描述:`"1​​2-18".Contains(" - ")` (13认同)
  • @ 8DH - 非常好抓:).重新阅读这个问题后,我认为我需要澄清`Contains` powershell运算符和`.Contains()`_.NET_`String`方法之间的区别. (4认同)
  • 这绝对是“假朋友”!:) “-contains”的存在意味着“属于一个列表”。 (2认同)

Eri*_*ris 36

-Contains实际上是一个集合运算符.如果集合包含对象,则为true.它不仅限于字符串.

-match并且-imatch是正则表达式字符串匹配器,并设置自动变量以用于捕获.

-like,-ilike是类似SQL的匹配器.


Esp*_*o57 10

你可以使用like:

"12-18" -like "*-*"
Run Code Online (Sandbox Code Playgroud)

splitcontains:

"12-18" -split "" -contains "-"
Run Code Online (Sandbox Code Playgroud)