阅读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
?它是否因历史原因而存在?
答案 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
。
换句话说:它取决于您的功能要求。