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()
.NETString
方法之间的区别。正如上面的评论中已经提到的,-Match
使用正则表达式。这意味着string参数是正则表达式,而不是普通字符串。例如,“hello”-Match”。
将返回true,因为“
是一个正则表达式,其中“.”将匹配任何字符。要检查字符串是否包含句号:“hello”-Match”\。
(返回false)这肯定是一个“false friend”!:)“-的存在包含“属于列表”的含义。