我经常发现我可以使用 Substring
或 replace
对字符串执行我需要执行的操作。
例如:获取本地仓库的远程 GitHub URL:
(git remote get-url origin).replace('.git', '')
$url = git remote get-url origin
$url.substring(0, $url.indexof('.git'))
显然是额外的一行,但值得吗?
如果有的话,是否有技术上的原因来使用一个而不是另一个?
答案 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 种不同技术之间做出决定的其他示例。