Знаете ли вы, что можно определить, заканчивается ли строка определенным символом или начинается с него в PowerShell? Томас Рейнер (Thomas Rayner) ранее поделился на CANITPRO.NET, как это легко сделать с помощью регулярных выражений (regular expressions) или, проще говоря, Regex.




За перевод спасибо нашему MSP, Льву Буланову.

Рассмотрим следующие примеры:


'something\' -match '\\$'
#returns true

'something' -match '\\$'
#returns false

'\something' -match '^\\'
#returns true

'something' -match '^\\'
#returns false

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

Шаблон регулярного выражения для первых двух выглядит так "\\$". Что это значит? Что ж, первая часть \\ означает «обратный слэш» (потому что \ — это escape-символ, а мы в основном экранируем escape-символ. Последняя часть $ является сигналом конца строки. По сути, мы имеем «вообще ничего, где последнее, что стоит на линии — это обратный слэш», и это именно то, что мы ищем.


В следующих двух примерах я просто переместил \\ в начало строки и начал с ^, а не с $, потому что ^ является сигналом для начала строки.


Теперь вы можете делать такие вещи, как:


$dir = 'c:\temp'
if ($dir -notmatch '\\$')
{
$dir += '\'
}
$dir
#returns 'c:\temp\'

Здесь скрипт проверяет, заканчивается ли строка ‘bears’ обратным слэшем, и если нет, я его добавлю.

Комментарии (10)


  1. AAT666
    26.02.2019 12:11

    Странный перевод…
    В оригинале рассматривается такой пример:

    'something\' -match '.+?\\$'

    И тогда понятие «строка» — логично. Но переводчик сократил регулярное выражение и оно теперь работает и для единичного символа!

    А последнее предложение, вообще, загадка. Или это сленг какой-то? В оригинале, кстати, точно так же:

    Here, the script checks to see if the string ‘bears’ ends in a backslash, and if it doesn’t, I’m appending one.


    1. sahsAGU Автор
      28.02.2019 00:20

      Небольшие проблемы с местным html. Исправимся :)


      1. AAT666
        28.02.2019 05:35

        Да бог с ним, с этим html — кому надо тот поймет )))

        Лучше растолкуйте про последнее предложение (;
        При чем там — if the string ‘bears’ — , если в примере $dir = 'c:\temp' ??


        1. The_Kf
          01.03.2019 01:22

          1. AAT666
            01.03.2019 06:09

            Оригинал, насколько я понял, вот это: «blogs.technet.microsoft.com/canitpro/2017/04/26/powershell-basics-detecting-if-a-string-ends-with-a-certain-character»

            И все копируют с опечаткой?


            1. sahsAGU Автор
              01.03.2019 07:00

              Ну как все. Мы переносим на Хабр статьи коллег из разных стран и переводим их. А опечатки — да, случаются с обеих сторон океана. :)


  1. alex-khv
    26.02.2019 12:54

    String.StartsWith()
    String.EndsWith()

    не?


    1. Forgottn
      28.02.2019 00:20

      Но ведь тогда не было бы статьи. А вообще, это тот самый пример про количество проблем и регулярные выражения.


    1. AAT666
      28.02.2019 05:29

      Эти методы не работают с regex'ом. Думаю, только из-за этого они и не приведены (хотя автор статьи и не акцентирует на этом внимание).

      Так-то можно еще проще проверять:

      'something\'[-1] -eq '\'


  1. okterij
    28.02.2019 00:20

    Пример с определением путей тоже притянут за уши, Join-Path корректно обрабатывает путь со слешем, вне зависимости от того, стоит ли там слэш или нет.