PowerShell -match与-like的区别

5
3个回答

8
我从未见过-match-like更快,通常我看到-like速度大约相同或更快。
但是我从不依赖于单个测试实例,我通常会运行大约10K次的每个测试。
如果您正在寻找性能,请始终优先选择字符串方法,如果它们满足要求:
$string = '123abc'    

(measure-command {
for ($i=0;$i -lt 1e5;$i++)
 {$string.contains('3ab')}
}).totalmilliseconds

(measure-command {
for ($i=0;$i -lt 1e5;$i++)
 {$string -like '*3ab*'}
}).totalmilliseconds

(measure-command {
for ($i=0;$i -lt 1e5;$i++)
 {$string -match '3ab'}
}).totalmilliseconds

265.3494
586.424
646.4878

1
确实,在这里使用-like-match更快(我的结果为149.6149、215.0783、284.6945)。 - Bad

6
请参考Differences Between -Like and -Match中的解释:
简而言之,如果您认为“我可能需要通配符来查找此项”,则应从-Like开始。但是,如果您对要查找的单词中的大多数字母相当确定,则最好尝试使用-Match。更技术性的区别是: -Match是正则表达式,而-Like仅是通配符比较,是-Match的子集。
因此,每当您不确定内部可能有哪些字符类(例如数字、字母、标点符号等)时,当您只想匹配任何字符时,应使用带有通配符的-Like
当您知道字符串开头必须是数字,后跟1个或多个冒号和字母数字字符序列,并且一直到字符串结尾时,您应使用带有强大正则表达式-Match

你让我在正则表达式模式中单独使用量词?我知道如果不在在线测试器中检查会发生什么。 - Wiktor Stribiżew
不,我不是那个意思,抱歉。我只是在评论这篇文章,它说通配符是正则表达式的一个子集,但显然它们并不是。它们比正则表达式弱,但它们不是一个子集。 - Paul Hicks
我明白了,但是我认为这里的“子集”一词表示它们也是模式,只是这些模式有些不同。它们也可以匹配特定的文本块,只是它们不能匹配正则语法。 - Wiktor Stribiżew
这个回答可能是合法的(并且值得点赞),但它仍然不能说服我使用 -like 而不是 -match,因为人们可以在正则表达式中轻松地用 ".*" 模拟通配符。 - Bad
1
如果您知道需要匹配以某些已知文字开头或结尾的字符串,那么-Like是更易读的选择。有些人非常注重可读性。通常,通配符比复杂的正则表达式更快,特别是带有.*子模式的正则表达式容易出现灾难性回溯。 - Wiktor Stribiżew
显示剩余3条评论

1
你应该在比较字符串是dos风格的文件名通配符时使用-like。如果你有一个被设计成看起来像“标准”Windows命令行应用程序的cmdlet,那么你可以期望文件名参数包括dos风格的通配符。
你可能会有一个类似于grep的cmdlet,它接受一个正则表达式和一个文件列表。我可以想象它被用作下面这样:
> yourMagicGrepper "^Pa(tt).*rn" *.txt file.*

当你处理第一个参数时,使用-match,处理所有其他参数时使用-like

换句话说:它取决于您的功能要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接