PowerShell 将字符串切成两半
PowerShell cut string in half
我有几行由相同的两半组成,我想从中删除一半;例如,'AbcAbc'
应该变成 'Abc'
。
数据总是这样:
10.22.20.106/tcp/8010.22.20.106/tcp/80
10.22.20.46/tcp/44310.22.20.46/tcp/443
10.22.20.90/tcp/44310.22.20.90/tcp/443
10.22.20.90/tcp/8010.22.20.90/tcp/80
10.22.20.89/tcp/44310.22.20.89/tcp/443
10.22.20.89/tcp/8010.22.20.89/tcp/80
10.22.20.29/tcp/44310.22.20.29/tcp/443
10.22.20.29/tcp/8010.22.20.29/tcp/80
10.22.20.122/tcp/44310.22.20.122/tcp/443
10.22.20.123/tcp/44310.22.20.123/tcp/443
10.22.20.79/tcp/44310.22.20.79/tcp/443
10.22.20.79/tcp/8010.22.20.79/tcp/80
10.22.20.78/tcp/44310.22.20.78/tcp/443
10.22.20.78/tcp/8010.22.20.78/tcp/80
10.22.20.74/tcp/44310.22.20.74/tcp/443
10.22.20.74/tcp/8010.22.20.74/tcp/80
10.22.20.22/tcp/44310.22.20.22/tcp/443
10.22.20.22/tcp/8010.22.20.22/tcp/80
10.22.20.99/tcp/44310.22.20.99/tcp/443
10.22.20.99/tcp/8010.22.20.99/tcp/80
10.22.20.54/tcp/44310.22.20.54/tcp/443
10.22.20.54/tcp/8010.22.20.54/tcp/80
我统计了字符串中的字符数,然后减半,但不知道如何使用计算(减半)的字符数来切割原始字符串。
$vip_ip = $vip_line.("Virtual IP Address/Protocol/Port")
$half_string = $vip_ip.length /2
$vip_ip.length
44
$half_string
22
$vip_cut = $vip_ip.(0,-$halfstring)
您正在尝试收集字符串方法所需的信息 "".SubString()
在你的情况下,你只需要这样的东西:
$vip_ip.substring(0,$halfstring)
从字符串的开头到一半。也可以从中途开始到最后,因为答案是一样的。 SubString()
支持两种重载。
$vip_ip.substring($halfstring)
is the way to go , but just to present a regex-based alternative with
-replace
, mostly as an interesting experiment:
注意:虽然此解决方案简洁明了,但在我的测试中它比基于 .Substring()
的方法慢 2-3 倍。
# Extract one half of the input string consisting of identical halves.
PS> '10.22.20.54/tcp/44310.22.20.54/tcp/443' -replace '^(.+)$', ''
10.22.20.54/tcp/443
正则表达式 ^(.+)
在开头匹配一个或多个 (+
)(非换行)字符 (.
) (^
) 并在 捕获组 .
中捕获它们 (...)
$
匹配 backreference (</code>),它指的是(第一个也是唯一的)捕获组匹配的内容,在字符串的末尾 (<code>$
).
实际上,只有当输入由相同的两半组成时,整个正则表达式才会匹配。
</code> 作为 <code>-regex
替换操作数然后 returns (第一个也是唯一的)捕获组匹配的内容,这是输入字符串的前半部分。
请注意,这样的正则表达式效率低下,因为它需要大量 回溯,因为事先不知道中间点。
使用 non-greedy 修饰符(+?
而不是 +
)在这种情况下也有效,但实际上在性能方面似乎没有区别(大概,然后使用 .+?
需要相同次数的“forward tracking”尝试。
我有几行由相同的两半组成,我想从中删除一半;例如,'AbcAbc'
应该变成 'Abc'
。
数据总是这样:
10.22.20.106/tcp/8010.22.20.106/tcp/80
10.22.20.46/tcp/44310.22.20.46/tcp/443
10.22.20.90/tcp/44310.22.20.90/tcp/443
10.22.20.90/tcp/8010.22.20.90/tcp/80
10.22.20.89/tcp/44310.22.20.89/tcp/443
10.22.20.89/tcp/8010.22.20.89/tcp/80
10.22.20.29/tcp/44310.22.20.29/tcp/443
10.22.20.29/tcp/8010.22.20.29/tcp/80
10.22.20.122/tcp/44310.22.20.122/tcp/443
10.22.20.123/tcp/44310.22.20.123/tcp/443
10.22.20.79/tcp/44310.22.20.79/tcp/443
10.22.20.79/tcp/8010.22.20.79/tcp/80
10.22.20.78/tcp/44310.22.20.78/tcp/443
10.22.20.78/tcp/8010.22.20.78/tcp/80
10.22.20.74/tcp/44310.22.20.74/tcp/443
10.22.20.74/tcp/8010.22.20.74/tcp/80
10.22.20.22/tcp/44310.22.20.22/tcp/443
10.22.20.22/tcp/8010.22.20.22/tcp/80
10.22.20.99/tcp/44310.22.20.99/tcp/443
10.22.20.99/tcp/8010.22.20.99/tcp/80
10.22.20.54/tcp/44310.22.20.54/tcp/443
10.22.20.54/tcp/8010.22.20.54/tcp/80
我统计了字符串中的字符数,然后减半,但不知道如何使用计算(减半)的字符数来切割原始字符串。
$vip_ip = $vip_line.("Virtual IP Address/Protocol/Port")
$half_string = $vip_ip.length /2
$vip_ip.length 44
$half_string 22
$vip_cut = $vip_ip.(0,-$halfstring)
您正在尝试收集字符串方法所需的信息 "".SubString()
在你的情况下,你只需要这样的东西:
$vip_ip.substring(0,$halfstring)
从字符串的开头到一半。也可以从中途开始到最后,因为答案是一样的。 SubString()
支持两种重载。
$vip_ip.substring($halfstring)
-replace
, mostly as an interesting experiment:
注意:虽然此解决方案简洁明了,但在我的测试中它比基于 .Substring()
的方法慢 2-3 倍。
# Extract one half of the input string consisting of identical halves.
PS> '10.22.20.54/tcp/44310.22.20.54/tcp/443' -replace '^(.+)$', ''
10.22.20.54/tcp/443
正则表达式
^(.+)
在开头匹配一个或多个 (+
)(非换行)字符 (.
) (^
) 并在 捕获组 . 中捕获它们 $
匹配 backreference (</code>),它指的是(第一个也是唯一的)捕获组匹配的内容,在字符串的末尾 (<code>$
).
实际上,只有当输入由相同的两半组成时,整个正则表达式才会匹配。</code> 作为 <code>-regex
替换操作数然后 returns (第一个也是唯一的)捕获组匹配的内容,这是输入字符串的前半部分。
(...)
请注意,这样的正则表达式效率低下,因为它需要大量 回溯,因为事先不知道中间点。
使用 non-greedy 修饰符(+?
而不是 +
)在这种情况下也有效,但实际上在性能方面似乎没有区别(大概,然后使用 .+?
需要相同次数的“forward tracking”尝试。