【问题标题】:PowerShell -match vs -likePowerShell -match vs -like
【发布时间】:2016-03-29 21:01:51
【问题描述】:

阅读official docs 很明显PowerShell -match 运算符比-like 更强大(由于正则表达式)。其次,根据这篇文章https://www.pluralsight.com/blog/software-development/powershell-operators-like-match,它似乎快了大约 10 倍。

是否存在我应该更喜欢-like 而不是-match 的特定情况?如果没有,我为什么要使用-like?是否因为历史原因而存在?

【问题讨论】:

    标签: regex powershell match


    【解决方案1】:

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

    【讨论】:

    • 确实,-like-match 快(我的结果是 149.6149、215.0783、284.6945)
    【解决方案2】:

    Differences Between -Like and -Match看这个解释

    简而言之,如果您在想,'我可能需要一个通配符才能找到这个项目',然后从 -Like 开始。但是,如果您非常确定要查找的单词中的大部分字母,那么您最好尝试使用-Match

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

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

    如果您知道开头必须有一个数字,后跟 1 个以上的冒号序列,后跟字母数字字符直到字符串的末尾,请使用 -Match 及其强大的 regular expressions

    【讨论】:

    • 嘿,那篇文章说通配符是正则表达式的子集。尝试将模式 * 通过正则表达式,看看会发生什么:)
    • 你告诉我在正则表达式模式中单独使用量词?我知道会发生什么,而无需在在线测试仪中进行检查。
    • 不,我不是那个意思,抱歉。我只是在评论这篇文章:它说通配符是正则表达式的一个子集,而显然它们不是。它们不如正则表达式强大,但它们不是一个子集。
    • 我明白了,但我认为这里的“子集”一词意味着它们也是模式,只是这些模式有些不同。它们还匹配特定的文本块,只是它们无法匹配常规语法。
    • 如果你知道你需要匹配一些以一些已知文字开头或结尾的字符串,-Like 是一个更易读的选择。有些人对可读性很着迷。通常,通配符比容易发生灾难性回溯的复杂正则表达式更快,尤其是对于 .* 子模式。
    【解决方案3】:

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

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

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

    当使用第一个参数时,您将使用-match,而对所有其他参数使用-like

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2020-08-06
      相关资源
      最近更新 更多