你能在 Powershell 的子字符串中使用负数吗?

问题描述 投票:0回答:2

PowerShell 中

Substring
的字符串长度属性可以使用负数吗?例如:

$str.Substring($startPos, -3)

我读到在 PowerShell 7 中可能已经添加了向后读取(“负值返回从输入字符串末尾开始请求的子字符串的数量”)但它看起来像是

Split
.

目前无法升级到v7。我在 v4 上。是否可以在版本 4 中执行此操作?

OR 是否有另一种在 PowerShell v4 中向后读取字符串的方法?

例子:

我需要替换

ABCD
,但由于逗号和缺乏一致的数据点,我很难找到一致的索引before
ABCD
。因此,为什么我使用
LastIndexOf
来找到最后一个逗号。现在,我希望我可以从最后一个逗号开始倒读
$replaceStr
的长度,如果这有意义的话。
$replaceStr.length
是我希望否定的。

$str = '12345,FOO FOO,ABCD,12351235'
$replaceStr = #code to get value of string that needs replaced
$str.Replace($str.Substring($str.LastIndexOf(',') + 1, $replaceStr.length), $Value)
powershell substring
2个回答
2
投票

尽量不要使代码过于复杂,如果通过拆分

,
将字符串转换为数组,然后更新倒数第二个标记,最后使用
,
作为分隔符将其重新加入,您可能会发现它更容易:

$str = '12345,FOO FOO,ABCD,12351235'
$tokens = $str.Split(',')
$tokens[-2] = 'myNewValue'
$str = $tokens -join ','
$str # 12345,FOO FOO,myNewValue,12351235

0
投票

LastIndexOf
有一个从给定索引开始的重载,因为搜索 backwards 朝向字符串的 start

LastIndexOf(Char, Int32)

报告此实例中指定 Unicode 字符最后一次出现的从零开始的索引位置。搜索从指定的字符位置开始,然后向后搜索字符串的开头。

所以一旦你找到结尾

,
你可以从位置before搜索它来寻找上一个:

$str = "12345,FOO FOO,ABCD,12351235";

# find the last ","
$end = $str.LastIndexOf(",");
# 18

# find the one before that
$start = $str.LastIndexOf(",", $end - 1);
# 13

# extract the result just to prove it's right :-)
$value = $str.Substring($start + 1, $end - $start - 1);
# ABCD

要替换原来的字符串,您可以这样做:

$replace = "WXYZ";

$result = $str.Substring(0, $start + 1) + $replace + $str.Substring($end);
# 12345,FOO FOO,WXYZ,12351235

在您的特定情况下,由于数据是 CSV 文件,因此最好使用

Import-Csv
ConvertFrom-Csv
并让这些 cmdlet 处理所有围绕引用字符串、数据换行符和其他边缘情况的复杂规则这将打破上述
LastIndeOf
方法。

例如,如果原始数据是这样的:

12345,FOO FOO,ABCD,"1235,1235"

你会得到错误的结果,因为最后一个逗号是 data 的一部分,而不是 syntax 所以不应该被匹配。

© www.soinside.com 2019 - 2024. All rights reserved.