Вашему регулярному выражению удается в принципе разделить интересующие токены, но оно не учитывает ведущие \\
во входных строках.
Вы можете использовать чередование регулярных выражений (|
) включить ведущий \\
в начале как дополнительный -split
разделитель .
Учитывая, что сопоставление разделителя в самом начале ввода создает пустой элемент с индексом 0
, вам нужно получить доступ к индексу 1
, чтобы получить интересующую подстроку.
Короче: регулярное выражение, переданное -split
, должно быть '^\\\\|\.(?!\d)'
вместо '\.(?!\d)'
, а индекс, используемый для доступа к результирующему массиву, должен быть [1]
вместо [0]
:
'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' |
ForEach-Object { ($_ -Split '^\\\\|\.(?!\d)')[1] }
Выше приведено:
tom
123.43.234.23
В качестве альтернативы , вы можете удалить ведущий \\
в отдельном шаге , используя -replace
:
'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' |
ForEach-Object { ($_ -Split '\.(?!\d)')[0] -replace '^\\\\' }
Еще другойальтернатива заключается в использовании одиночной -replace
операции , которая не требует ForEach-Object
вызова (не требует явной итерации):
'\\tom.overflow.corp.com', '\\123.43.234.23.overflow.corp.com' -replace
'?(x) ^\\\\ (.+?) \.\D .+', '$1'
Встроенный параметр (?x)
(IgnoreWhiteSpace
) позволяет сделать регулярные выражения более читабельными с незначительным пробелом: любой unescaped пробелы могут использоваться для визуального форматирования.
^\\\\
соответствует \\
(экранировано \
) в начале (^
) каждогострока.
(.+?)
лениво соответствует одному или нескольким символам.
\.\D
соответствует литералу .
, за которым следует что-то другие , кроме цифры (\d
соответствует цифре, \D
- отрицание этого).
.+
соответствует одному или нескольким оставшимся символам, т. е.остальная часть ввода.
$1
в качестве операнда замены указывает, что 1-я группа захвата ((...)
) в регулярном выражении совпала, и, учитывая, что регулярное выражение было разработанопотребляет всю строку, заменяет ее только этим.