Нужно отделить время от строки - PullRequest
0 голосов
/ 23 мая 2019

Я ищу способ удалить весь текст раньше времени, которое выглядит как 8 утра или 8:00 утра, в зависимости от того, что пользователь будет печатать. Это может быть любое время для фронта, включая вечера.

Вот что я ищу:

$appointment = "9th annual fundraiser - 8:30 am - 3 pm"

Это также может выглядеть как:

$appointment = "9th annual fundraiser - (8:30 am - 3 pm)"

или

$appointment = "9th annual fundraiser - (event 8:30 am - 3 pm)"

или

$appointment = "9th annual fundraiser 8:30 am - 3:00 pm"

Для большинства других приложений я использую следующее:

$appointment -creplace '^[^1-9]*' 

но в данном случае это не работает, и я искал хороший ответ, используя? И все остальное, и я не понимаю этого.

Моя цель - сделать так, чтобы в этом случае он пропускал первое число (может быть 1-е, 2-е, 3-е, 4-е и т. Д.) И заставлял его тянуть время. Так что $appointment будет выглядеть так:

8:30 - 15:00

Я пытался использовать эти формулы, и я не могу сказать, чтобы вытащить времена, которые будут обычно , будут X: XX.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вот решение, основанное на этом регулярном выражении: \d+(:\d+)?\s+[ap]m

Описание RegEx:

  1. \d+: одна или несколько цифр
  2. (:\d+)?:Двоеточие сопровождается одной или несколькими цифрами.Один или ноль этой комбинации.Вот как это работает в 3:00 AM и 3 AM.
  3. \s+: один или несколько пробелов (между 3:00 и AM).Сделайте это \s*, чтобы сделать пространство необязательным.
  4. [ap]m: утра или вечера

Решение 1

$regex = "\d+(:\d+)?\s+[ap]m"
$matches = ($appointment | Select-String $regex -AllMatches).Matches.Value
$matches -join " - "

Решение 2

$regex = "\d+(:\d+)?\s+[ap]m"
$regex = $regex + "\s*[-]\s*" + $regex
$matches = ($appointment | Select-String $regex -AllMatches).Matches.Value
$matches

Если вы уверены, что ваш ввод содержит 2 раза, я предпочитаю Решение 1, потому что оно не зависит от того, что находится между промежутками времени.Так что это работает и для таких вещей, как «3 вечера до 6 вечера».

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

Вот один подход с использованием регулярных выражений:

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 цифры* в строке времени.

Дайте мне знать, если у вас есть какие-либо вопросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...