PowerShell和-contains运算符

PowerShell和-contains运算符,powershell,operators,string-matching,Powershell,Operators,String Matching,考虑以下代码段: "12-18" -Contains "-" 您可能会认为它的计算结果为true,但事实并非如此。这将计算为false。我不知道为什么会这样,但确实如此 为了避免这种情况,您可以使用以下方法: "12-18".Contains("-") 现在表达式的计算结果将为true 为什么第一个代码段的行为是这样的?-是否有一些特殊的东西不能很好地处理-包含的?没有提及任何内容。运算符-Contains不进行

考虑以下代码段:

"12-18" -Contains "-"
您可能会认为它的计算结果为
true
,但事实并非如此。这将计算为
false
。我不知道为什么会这样,但确实如此

为了避免这种情况,您可以使用以下方法:

"12-18".Contains("-")
现在表达式的计算结果将为true


为什么第一个代码段的行为是这样的?
-
是否有一些特殊的东西不能很好地处理
-包含的
?没有提及任何内容。

运算符
-Contains
不进行子字符串比较,匹配必须在完整字符串上,并用于搜索集合

从您链接到的文档中:

-包含 描述:安全壳操作员说明参考值集合是否包含单个测试值。

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

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

示例:

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

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match
我想你想要的是接线员:

"12-18" -Match "-"
返回
True


重要提示:正如注释和中指出的,应该注意,
-Match
操作符用于执行文本匹配。

-Contains
实际上是一个集合操作符。如果集合包含对象,则为true。它不限于字符串

是正则表达式字符串匹配器,并设置用于捕获的自动变量


-like
-ilike
是类似SQL的匹配器。

您可以使用
like

"12-18" -like "*-*"
包含的
拆分

"12-18" -split "" -contains "-"
  • like
    是最好的,或者至少是最简单的
  • match
    用于正则表达式比较

参考:

为了完整性,而-Match可能是一个很好的匹配,它使用正则表达式。如果你想要一个明确的字符串包含检查,你应该按照OP描述的那样做:
“12-18”。包含(“-”
@8DH-非常好的捕获:)。在重读了这个问题之后,我想我需要澄清
Contains
powershell操作符和
.Contains()
.NET
String
方法之间的区别。正如上面的评论中已经提到的,
-Match
使用正则表达式。这意味着string参数是正则表达式,而不是普通字符串。例如,
“hello”-Match”。
将返回true,因为“
是一个正则表达式,其中“.”将匹配任何字符。要检查字符串是否包含句号:
“hello”-Match”\。
(返回false)这肯定是一个“false friend”!:)“-的存在包含“属于列表”的含义。