PowerShell разрезать строку пополам - PullRequest
2 голосов
/ 12 марта 2019

У меня есть строки, которые состоят из одинаковых половинок, из которых я хочу удалить одну половину;например, '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 * ​​1016*

$vip_cut = $vip_ip.(0,-$halfstring)

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Ответ Мэтта - это путь , но только для представления альтернативы regex с
-replace, в основном в качестве интересного эксперимента :

Примечание. Хотя это решение является кратким, оно неясное и в 2-3 раза медленнее в моих тестах, чем подход, основанный на .Substring().

# 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-я и только) группа захвата совпадает в конце строки ($).
    Фактически, все регулярные выражения будут совпадать только в том случае, если входные данные состоят из одинаковых половин.

  • $1 в качестве операнда замены -regex затем возвращает совпадение (1-й и только) группы захвата, которая является первой половиной входной строки.

Обратите внимание, что такое регулярное выражение неэффективно, так как требует большого обратного отслеживания , учитывая, что половина пути заранее неизвестна.
Использование не жадного модификатора (+? вместо +) также работает в этом случае, но на практике, похоже, не имеет значения с точки зрения производительности (предположительно, использование .+? требует равного количества " forward tracking""попытки).

2 голосов
/ 12 марта 2019

Вы пытаетесь собрать информацию, которая вам понадобится для строкового метода "".SubString()

В вашем случае вам просто нужно что-то вроде этого:

$vip_ip.substring(0,$halfstring)

С самого начала строки и идти на полпути. Можно также начать с половины до конца, так как ответ тот же. SubString() поддерживает обе перегрузки.

$vip_ip.substring($halfstring)
...