Вот один подход с использованием регулярных выражений:
Function Get-StringTime()
{
# Set up a results ArrayList
$results = New-Object System.Collections.ArrayList
$regexs = @(
# See https://regexr.com/ and you can drop
# these expressions into the bar up top and
# the Tools section at the bottom will explain
# each expression
[regex]"\b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b", # matches 8:00am-3:00pm
[regex]"\b\d{1}(am|pm)-\d{1}(am|pm)\b", # matches 8am-3pm
[regex]"\b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b", # matches 8:00am-3pm
[regex]"\b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b" # matches 8am-3:00pm
)
# Setup sample data, 1 for each match
$a1 = '9th annual fundraiser - (8am - 3pm)'
$a2 = '9th annual fundraiser - (8am - 3:00pm)'
$a3 = '9th annual fundraiser - (8:00am - 3pm)'
$a4 = '9th annual fundraiser - (8:00am - 3:00pm)'
$a5 = '9th annual fundraiser - (13:00pm - 1:00am)'
$arrs = @($a1, $a2, $a3, $a4, $a5)
foreach($appointment in $arrs)
{
# strip out all the spaces so we can use less regexs
$newAppointment = $appointment.Replace(' ','')
Write-Host "`nAppointment data: " -NoNewline
Write-Host $newAppointment -ForegroundColor Magenta
# check this against each regex
foreach($regex in $regexs)
{
Write-Host "Trying regex: " -NoNewline
<#
To show the user the regex being used
we need to convert to a string, otherwise
it will return an object type of RegEx
which default outputs like this:
Options MatchTimeout RightToLeft
------- ------------ -----------
None -00:00:00.0010000 False
#>
Write-Host $($regex.ToString()) -ForegroundColor Yellow
if($regex.Match($newAppointment).Value -ne '')
{
Write-Host "Match found | " -NoNewline -ForegroundColor Green
Write-Host "Item: $($arrs.IndexOf($appointment)) | Regex match Index: $($regexs.IndexOf($regex))"
$results.Add([PSCustomObject]@{
TimeString=$regex.Match($newAppointment).Value;
AppointmentIndex=$($arrs.IndexOf($appointment));
MatchingRegex=$regex.ToString();
MatchingRegexIndex=$regexs.IndexOf($regex);
}) | Out-Null
}
else {
Out-Null
}
}
}
return $results
}
Get-StringTime
Выходные данные (с раскрашиванием в консоли PS):
Appointment data: 9thannualfundraiser-(8am-3pm)
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}(am|pm)\b
Match found | Item: 0 | Regex match Index: 1
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b
Appointment data: 9thannualfundraiser-(8am-3:00pm)
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b
Match found | Item: 1 | Regex match Index: 3
Appointment data: 9thannualfundraiser-(8:00am-3pm)
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b
Match found | Item: 2 | Regex match Index: 2
Trying regex: \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b
Appointment data: 9thannualfundraiser-(8:00am-3:00pm)
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b
Match found | Item: 3 | Regex match Index: 0
Trying regex: \b\d{1}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b
Appointment data: 9thannualfundraiser-(13:00pm-1:00am)
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b
Trying regex: \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b
TimeString AppointmentIndex MatchingRegex MatchingRegexIndex
---------- ---------------- ------------- ------------------
8am-3pm 0 \b\d{1}(am|pm)-\d{1}(am|pm)\b 1
8am-3:00pm 1 \b\d{1}(am|pm)-\d{1}:\d{2}(am|pm)\b 3
8:00am-3pm 2 \b\d{1}:\d{2}(am|pm)-\d{1}(am|pm)\b 2
8:00am-3:00pm 3 \b\d{1}:\d{2}(am|pm)-\d{1}:\d{2}(am|pm)\b 0
Надеюсь, это даст вам возможность взломать.Если вы хотите сделать его более пригодным для повторного использования, вы можете добавить параметр в вызов функции, например:
Function Get-StringTime([String]$AppointmentText){...}
, и вызвать его в приглашении PS или в сценарии, который загружает эту функцию (либо жестко закодировано вили может быть лучше из импортированного модуля):
$someVariable = Get-StringTime -AppointmentText '9th annual fundraiser - (8am - 3pm)'
Write-Output $someVariable
Для этого потребуется вырезать жестко закодированные примеры, которые я добавил, чтобы представить некоторые возможные сценарии, от $a1
до $a5
, иизменив $arrs
на $arrs = @($AppointmentText)
или другими способами, вплоть до того, что вы предпочитаете.
Обратите внимание, что это не учитывает время в стиле милитари, XX: XX или перестановки, где перед * 1021 стоят 2 цифры* в строке времени.
Дайте мне знать, если у вас есть какие-либо вопросы