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”尝试。