我有一些由相同的两半组成的行,我想从中删除一半;例如,'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)
最佳答案
<强> Matt's answer是要走的路,但只是为了呈现 regex基于 -replace
的替代方案,主要作为一个有趣的实验:
注意:虽然此解决方案很简洁,但在我的测试中它很晦涩,并且比基于 .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 '^(.+)\1$', '$1'
10.22.20.54/tcp/443
正则表达式子表达式
^(.+)
匹配一个或多个 (+
)(非换行符)字符 (.
)在字符串的开头 (^
) 并在捕获组中捕获它们(...)
。\1$
匹配反向引用 (\1
),它引用(第一个也是唯一的)捕获组匹配,位于字符串末尾 ($
)。
实际上,只有输入由相同的两半组成时,整个正则表达式才会匹配。$1
作为-regex
替换操作数,然后返回(第一个也是唯一的)捕获组匹配的内容,即输入字符串的前半部分。
请注意,这样的正则表达式效率很低,因为它需要大量回溯,因为事先不知道中间点。
在这种情况下,使用非贪婪修饰符(+?
而不是+
)在这种情况下也有效,但实际上在术语上似乎没有区别性能(大概,使用 .+?
则需要相同次数的“前向跟踪”尝试)。
关于regex - PowerShell 将字符串切成两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55120680/