regex - PowerShell 将字符串切成两半

标签 regex powershell substring backtracking backreference

我有一些由相同的两半组成的行,我想从中删除一半;例如,'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/

相关文章:

function - 如何计算 Powershell 中用户的年龄

c# - switch 语句 - 验证子串

ruby - 如何用 MatchData 对象替换 Perl 风格的正则表达式

php - preg_match - 只能由数字、连字符 (-) 和空格组成

powershell - 无法从空的.txt文件执行export-csv

powershell - 循环 while 工作日 + 营业时间

string - 递归删除子字符串的出现

language-agnostic - substring() 应该如何工作?

sql - 这些查询是否相同?如果不是如何进行更简单的查询

python - 对于没有参数的情况,str.split 是如何实现的