Regex PowerShell-匹配vs-like
通过阅读,很明显PowerShellRegex PowerShell-匹配vs-like,regex,powershell,match,Regex,Powershell,Match,通过阅读,很明显PowerShell-match操作符比-like(由于正则表达式)更强大。其次,根据本文,它似乎快了约10倍 是否有特定情况下我更喜欢-like而不是-match?如果没有,我为什么要使用-like?它的存在是因为历史原因吗?当比较器字符串是dos样式的文件名通配符时,您应该更喜欢-like。如果您有一个设计为类似“标准”windows命令行应用程序的cmdlet,那么您可以期望文件名参数包含dos样式的通配符 您可能有一个类似grep的cmdlet,它接受一个正则表达式和一个
-match
操作符比-like
(由于正则表达式)更强大。其次,根据本文,它似乎快了约10倍
是否有特定情况下我更喜欢
-like
而不是-match
?如果没有,我为什么要使用-like
?它的存在是因为历史原因吗?当比较器字符串是dos样式的文件名通配符时,您应该更喜欢-like
。如果您有一个设计为类似“标准”windows命令行应用程序的cmdlet,那么您可以期望文件名参数包含dos样式的通配符
您可能有一个类似grep的cmdlet,它接受一个正则表达式和一个文件列表。我可以想象它被这样使用:
> yourMagicGrepper "^Pa(tt).*rn" *.txt file.*
在处理第一个参数时,您将使用-match
,对于所有其他参数,您将使用-like
换句话说:这取决于您的功能需求。请参见 简而言之,如果您在想,‘我可能需要一个通配符来查找此项’,那么就从
开始,比如。但是,如果您对要查找的单词中的大多数字母都非常确定,那么最好尝试使用-Match
这里有一个更技术性的区别:-Match
是一个正则表达式,而-Like
只是一个通配符比较,是-Match
的子集
因此,当您不确定其中可以包含哪些字符类,即数字、字母、标点符号等时,当您只想匹配任何字符时,应使用类似于
的通配符
如果您知道必须在开头有一个数字,后面是1+个冒号序列,后面是字母数字字符,一直到字符串的末尾,请使用-Match
及其强大功能。我从未见过-Match
测试比-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
嘿,那篇文章说通配符是正则表达式的一个子集。尝试将模式*
放到正则表达式中,看看会发生什么:)你告诉我在正则表达式模式中单独使用量词吗?我知道如果不在在线测试仪中检查会发生什么。不,我不是那个意思,对不起。我只是在评论这篇文章:它说通配符是正则表达式的一个子集,而它们显然不是。它们不如正则表达式强大,但它们不是子集。我明白了,但我认为这里的“子集”一词意味着它们也是模式,只是这些模式有些不同。它们还匹配特定的文本块,只是它们不能匹配常规语法。如果您知道需要匹配以某个已知文本开头或结尾的字符串,那么像
这样的-Like是一个更可读的选择。有些人热衷于可读性。通常,通配符比复杂的正则表达式要快,而复杂的正则表达式容易发生灾难性的回溯,尤其是在*
子模式中。实际上,-like
比-match
在这里快(我的结果149.6149215.0783284.6945)