哪个更高效:“替换”或“子字符串”?

时间:2021-05-03 19:51:06

标签: string powershell replace substring

我经常发现我可以使用 Substringreplace 对字符串执行我需要执行的操作。

例如:获取本地仓库的远程 GitHub URL:

  1. (git remote get-url origin).replace('.git', '')
  2. $url = git remote get-url origin
    $url.substring(0, $url.indexof('.git'))
    

显然是额外的一行,但值得吗?

如果有的话,是否有技术上的原因来使用一个而不是另一个?

1 个答案:

答案 0 :(得分:4)

当然这是一个偏好。这也是有条件的,您最好尝试将工具放入工具箱中,并尝试了解何时最好使用哪种工具。而且,我认为这在很大程度上是您的问题所在。

有了 2 个可行的解决方案,这个特殊的例子是最不用担心的。但是,我要指出 .Replace() 区分大小写,许多其他底层 .Net 字符串方法也是如此。 .Substring() 处理索引不是,但在您的示例中,您依赖于默认情况下区分大小写的 .IndexOf()`。

根据 mklement0 的有用评论:

.IndexOf() & LastIndexOf() 可以使用额外的重载设置为不区分大小写,例如:

"SomEthing".IndexOf("e", [System.StringComparison]::OrdinalIgnoreCase)

注意:.Net 4.x 及以下版本中的 .Replace() 没有不区分大小写的模式,因此 Windows PowerShell 的任何版本也不会有它。 .Net core 确实有这个选项,所以它在 PowerShell 6+ 中可用。

对于 .Replace().Split(),使用 PowerShell 原生 -replace-split 会更安全一些。这不仅在默认情况下不区分大小写,而且还使您免受 .Net 方法中的潜在变化的影响,正如 .Split() 从 .Net 到 .Net Core 的重载首选项所发生的情况。

也就是说,作为如何做出此类决策的示例,.Net 方法更快。因此,在某些情况下,您可能会选择使用它们而不是 PowerShell 本机运算符。请注意注意事项,包括但不限于此处讨论的事项。

注意:.StartsWith().EndsWith() 也区分大小写,因此我们可能会改为使用 -match "^string"-like "string*" 检查这些条件。同样,这些只是您如何在 2 种不同技术之间做出决定的其他示例。