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/

相关文章:

java - 如何在Java中使用正则表达式

Python 正则表达式 finditer 的第二组被第一个捕获组忽略

powershell - 如果 testfile1.log 存在,则创建 testfile2.log,依此类推。- PowerShell

java - 当字符串的长度发生变化时,如何从字符串中获取数字?

python - 查找以特定符号开头,然后连续出现特定单词和模式的多个匹配项

ruby - 用于将字符串与 ruby​​ 中的数字匹配的正则表达式

powershell - 打开和关闭 RDP 窗口

powershell - 如何在 PowerShell 中使用 $PSCmdlet.WriteError 实际上生成错误?

python - 查找字符后的最后一个子字符串

ios - subString emution ios