Как «разделить» строку в PowerShell, используя строку из нескольких символов? - PullRequest
0 голосов
/ 19 ноября 2018

При использовании оператора .Split () для строки в PowerShell и попытке разделения, используя строку из более чем одного символа, PowerShell демонстрирует странное поведение - он использует любой символов в строке для раскол.

Например:

PS C:\Users\username> "One two three keyword four five".Split("keyword")
On
 t

 th









 f
u
 fiv

Я не знаю о вас, но я ожидал, что результаты будут такими, как:

@("One two three "," four five")

Как мне разбить строку, рассматривая "сплиттер" как буквальную строку? Для тех, кто прибывает из VBScript, именно так вела себя встроенная функция Split () в VBScript.

Пара других заметок:

  • Я провел поиск и нашел несколько предложенных решений, использующих RegEx; Я бы предпочел не использовать его, если этого можно избежать.
  • Мне нужно решение, которое работает на всех версиях PowerShell.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Нет необходимости создавать функцию.

Функцию split можно использовать двумя различными способами.Если вы используете:

"One two three keyword four five".Split("keyword")

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

"One two three keyword four five" -Split ("keyword")

, то в качестве сплиттера используется строка «ключевое слово».

0 голосов
/ 19 ноября 2018

Оператор -split ожидает RegEx, но его можно заставить сделать это хорошо.Однако оператор -split доступен только в Windows PowerShell v3 +, поэтому он не соответствует требованиям, указанным в вопросе.

Объект [regex] имеет метод Split (), который также может справиться с этим, ноон ожидает RegEx как «сплиттер».Чтобы обойти это, мы можем использовать второй объект [regex] и вызвать метод Escape () для преобразования нашей буквенной строки «splitter» в экранированный RegEx.

Оборачивая все это в простую в использовании функцию, котораяработает обратно в PowerShell v1, а также в PowerShell Core v6.

function Split-StringOnLiteralString
{
    trap
    {
        Write-Error "An error occurred using the Split-StringOnLiteralString function. This was most likely caused by the arguments supplied not being strings"
    }

    if ($args.Length -ne 2) `
    {
        Write-Error "Split-StringOnLiteralString was called without supplying two arguments. The first argument should be the string to be split, and the second should be the string or character on which to split the string."
    } `
    else `
    {
        if (($args[0]).GetType().Name -ne "String") `
        {
            Write-Warning "The first argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString."
            $strToSplit = [string]$args[0]
        } `
        else `
        {
            $strToSplit = $args[0]
        }

        if ((($args[1]).GetType().Name -ne "String") -and (($args[1]).GetType().Name -ne "Char")) `
        {
            Write-Warning "The second argument supplied to Split-StringOnLiteralString was not a string. It will be attempted to be converted to a string. To avoid this warning, cast arguments to a string before calling Split-StringOnLiteralString."
            $strSplitter = [string]$args[1]
        } `
        elseif (($args[1]).GetType().Name -eq "Char") `
        {
            $strSplitter = [string]$args[1]
        } `
        else `
        {
            $strSplitter = $args[1]
        }

        $strSplitterInRegEx = [regex]::Escape($strSplitter)

        [regex]::Split($strToSplit, $strSplitterInRegEx)
    }
}

Теперь, используя предыдущий пример:

PS C:\Users\username> Split-StringOnLiteralString "One two three keyword four five" "keyword"
One two three
 four five

Volla!

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