PowerShell -match vs -like

时间:2016-03-29 21:01:52

标签: regex powershell match

阅读official docs很明显,PowerShell public class Main { public static void main(String[] args) throws IOException { File file = new File("test.txt"); BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); ArrayList<String> operations = new ArrayList<String>(); ArrayList<Point> points = new ArrayList<Point>(); String line; String[] array; int index; while((line = bufferedReader.readLine()) != null) { array = line.split(" "); if((index = hasOperation(array[0], operations)) == -1) { operations.add(array[0]); index = operations.size()-1; points.add(new Point(index, Integer.parseInt(array[1]))); } else { points.add(new Point(index, Integer.parseInt(array[1]))); } } System.out.print("["); for(int i = 0; i < points.size()-1; i++) { System.out.print(points.get(i).toString() + ","); } System.out.println(points.get(points.size()-1).toString()+"]"); } public static int hasOperation(String operation, ArrayList<String> operations ){ for(int index = 0; index < operations.size(); index++) { if(operation.equalsIgnoreCase(operations.get(index))) return index; } return -1; } } public class Point { public int x; public int y; public Point(int x, int y){ this.x = x; this.y = y; } @Override public String toString() { return "[" + x + "," + y + "]"; } } 运算符比-match更强大(由于正则表达式)。其次,根据这篇文章https://www.pluralsight.com/blog/software-development/powershell-operators-like-match,它似乎快了~10倍。

我是否应该选择-like而不是-like?如果没有,为什么我应该使用-match?它是否因历史原因而存在?

3 个答案:

答案 0 :(得分:4)

请参阅Differences Between -Like and -Match

中的解释
  

简而言之,如果您正在考虑,'我可能需要使用通配符来查找此项',然后从-Like开始。但是,如果你非常确定你正在寻找的单词中的大多数字母,那么你最好试用-Match

     

这是一个更具技术性的区别:-Match是正则表达式,而-Like只是一个通配符比较,是-Match的一个子集。

所以,每当你不确定哪些字符类,即数字,字母,标点符号等可以在里面,当你只想匹配任何字符时,你应该使用{ {1}}及其通配符

如果您知道在开始时必须有一个数字,然后是1个以上的冒号序列,后跟字母数字字符,直到字符串的结尾,请使用-Like及其强大的regular expressions。< / p>

答案 1 :(得分:4)

我从未见过-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

答案 2 :(得分:1)

当比较器字符串是dos样式的文件名通配符时,您应该更喜欢-like。如果您的cmdlet看起来像&#34;标准&#34;在Windows命令行应用程序中,您可以期望文件名参数包含dos样式的通配符。

您可能有一个类似grep的cmdlet,它接受正则表达式和文件列表。我可以想象它被这样使用:

> yourMagicGrepper "^Pa(tt).*rn" *.txt file.*

在使用第一个参数时,您将使用-match;对于所有其他参数,您将使用-like

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