Powershell: как получить подстроку текста - PullRequest
0 голосов
/ 09 мая 2019

У меня есть поле, description, которое содержит текст в предсказуемом формате, который выглядит как 1 из этих 2 вариантов,

DEACTIVATED on Tue Apr 02 2019

или

DEACTIVATED on Tue Apr 02 2019 | MANAGER John Smith

Мне нужно взять только дату в каждом случае, Tue Apr 02 2019, учитывая, что текст после даты или нет.

Пример использования

$string = "DEACTIVATED on Tue Apr 02 2019 | MANAGER John Smith"
$date   = "Tue Apr 02 2019"

Ответы [ 4 ]

0 голосов
/ 09 мая 2019

Я бы использовал:


## Q:\Test\2019\05\09\SO_56060672.ps1

$strings = @"
DEACTIVATED on Tue Apr 02 2019

DEACTIVATED on Tue Apr 09 2019 | MANAGER John Smith
"@ -split '\r?\n'

$RE = '(?<=DEACTIVATED on ).*\d{4}'

## Output found datetime strings
$strings | Select-String $RE | ForEach-Object{$_.Matches.value}

## if your locale is English convert to [datetime] type
$strings | Select-String $RE | ForEach-Object{
    [datetime]::ParseExact($_.Matches.value,'ddd MMM dd yyyy',$null)
}

## if your locale is NOT English convert to [datetime] type
$strings | Select-String $RE | ForEach-Object{
    [datetime]::ParseExact($_.Matches.value,'ddd MMM dd yyyy',
       [System.Globalization.CultureInfo]::InvariantCulture)
}

Вывод первого и последнего в моем немецком языке:

Tue Apr 02 2019
Tue Apr 09 2019

Dienstag, 2. April 2019 00:00:00
Dienstag, 9. April 2019 00:00:00
0 голосов
/ 09 мая 2019

Вот как я это понял, поскольку мне приходилось учитывать некоторые потенциальные различия между объектами

$text = "DEACTIVATED on Tue Apr 02 2019 | MANAGER John Smith"
$start_pos = $text.IndexOf('on')

$substring = $text.substring($start_pos + 3)

if ($text.IndexOf(' | ') -gt -1) {
    $end_pos = $text.indexOf(' | ')
    $substring = $substring.substring(0, $end_pos)
}
0 голосов
/ 09 мая 2019

вот немного другой способ сделать работу.[ ухмылка ]

что он делает ...

  • первые 4 строки создают массив строк для работы с
  • итерациями черезколлекция
  • разбивается на '|'
  • принимает 1-й элемент в результирующем массиве
  • удаляет все начальные / конечные пробелы
  • использует именованную группу захвата для получения строки даты после DEACTIVATED on
  • показывает результирующую именованную группу захвата
  • преобразует это в [datetime] объект и отображает, что

вот код ...

$DescriptionText = @(
    'DEACTIVATED on Sat May 11 2019'
    'DEACTIVATED on Tue Apr 02 2019 | MANAGER John Smith'
    )

foreach ($DT_Item in $DescriptionText)
    {
    $Null = $DT_Item.Split('|')[0].Trim() -match 'DEACTIVATED on (?<DeactivationDate>.+)'

    $Matches.DeactivationDate
    [datetime]::ParseExact($Matches.DeactivationDate, 'ddd MMM dd yyyy', $Null)
    '=' * 20
    }

вывод ...

Sat May 11 2019

2019 May 11, Saturday 12:00:00 AM
====================
Tue Apr 02 2019
2019 April 02, Tuesday 12:00:00 AM
====================

Я не могу понять, откуда взялась пустая строка в 1-й паре выходов.[ румянец ]

0 голосов
/ 09 мая 2019

Не уверен, правильно ли я понял, но подстрока работает так:

$string = "DEACTIVATED on Tue Apr 02 2019 | MANAGER John Smith"
#.substring(starting point, how many)
$date = $string.Substring(15,10)
$date
Tue Apr 02
...