Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PowerShell-匹配vs-like_Regex_Powershell_Match - Fatal编程技术网

Regex PowerShell-匹配vs-like

Regex PowerShell-匹配vs-like,regex,powershell,match,Regex,Powershell,Match,通过阅读,很明显PowerShell-match操作符比-like(由于正则表达式)更强大。其次,根据本文,它似乎快了约10倍 是否有特定情况下我更喜欢-like而不是-match?如果没有,我为什么要使用-like?它的存在是因为历史原因吗?当比较器字符串是dos样式的文件名通配符时,您应该更喜欢-like。如果您有一个设计为类似“标准”windows命令行应用程序的cmdlet,那么您可以期望文件名参数包含dos样式的通配符 您可能有一个类似grep的cmdlet,它接受一个正则表达式和一个

通过阅读,很明显PowerShell
-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)