Разделить строку на символ, за исключением того, что удвоенный символ является escape - PullRequest
2 голосов
/ 29 марта 2012

Входные данные:

$string = "this-is-just-an--example"

Выходные данные:

this
is
just
an-example

Пробовал различные вещи вокруг Regex.Split и "- [^ -]" или "- ([^])",Пример того, что не сработало:

[regex]::Split( $string, "-[^-]" )
[regex]::Split( $string, "-([^-])" )

Конечно, я могу использовать String.Split и итерировать, и понять, что пустая строка означает, что я наткнулся на экранированный символ ... Но это ужасный код.PS несколько минут пытался искать дупла, не нашел.

Ответы [ 2 ]

0 голосов
/ 13 июня 2012

Замена escape-последовательности другим значением сначала устраняет необходимость в сложном условии разделения.Все, что нужно, - это уникальное значение замены, которое еще не отображается в строке.

Например, при использовании @ в качестве значения замены для $string = 'this-is-just-an--example' следующая строка получит желаемый результат:

$string -replace '--','@' -split '-' -replace '@','-'
  • -replace '--','@' исключает escape-последовательность (дает this-is-just-an@example),
  • -split '-', затем разделяет результат (дает массив, содержащий this, is, just и an@example),
  • и, наконец, -replace '@','-' восстанавливает экранированное значение (давая this, is, just, an-example).

Оба -split и -replace являются встроенными операторами PowerShell, которые работают со строками с использованием регулярных выражений (эквивалентно Regex.Splitи Regex.Replace методов в .NET).

0 голосов
/ 29 марта 2012

Используйте утверждения lookahead и lookbehind, а затем выполните замену, чтобы исключить оставшиеся удвоенные символы:

$string = "this-is-just-an--example"
$string -split '(?<!-)-(?!-)' -replace '--','-'

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