Разбить длинное выражение регулярного выражения на несколько строк? - PullRequest
3 голосов
/ 19 января 2020

Можно ли как-нибудь разбить регулярное выражение на несколько строк, чтобы оно не выходило за пределы моего редактора?

if (!($_ -match 'e_eld\.s|od_eld\.|oe_eld\.s|of_eld\.s|og_eld\.s|1c_eld\.s|2c_eld\.s|3c_eld\.s|4c_eld\.s|1c_eld\.s|o2_eld\.s|o3_eld\.s|o4_eld\.s|o5_eld\.s'))
{
    # stuff
}

Когда я пытаюсь сделать следующее, это не работает. Я также пытался окружить его `` и всеми другими уловками, но, похоже, ничего не работает, и я не мог найти ничего другого по этому поводу (возможно, мои навыки поиска плохие).

if (!($_ -match 'e_eld\.s|
                 od_eld\.s|
                 oe_eld\.s|
                 of_eld\.s|
                 og_eld\.s|
                 1c_eld\.s|
                 2c_eld\.s|
                 3c_eld\.s|
                 4c_eld\.s|
                 1c_eld\.s|
                 o2_eld\.s|
                 o3_eld\.s|
                 o4_eld\.s|
                 o5_eld\.s'))
{
    # stuff
}

Ответы [ 2 ]

6 голосов
/ 19 января 2020

Вы можете использовать опцию IgnorePatternWhitespace regex через встроенную форму, (?x):

if ($_ -notmatch '(?x)
                  e_eld\.s|
                  od_eld\.s|
                  oe_eld\.s|
                  of_eld\.s|
                  og_eld\.s|
                  1c_eld\.s|
                  2c_eld\.s|
                  3c_eld\.s|
                  4c_eld\.s|
                  1c_eld\.s|
                  o2_eld\.s|
                  o3_eld\.s|
                  o4_eld\.s|
                  o5_eld\.s')
{
    # stuff
}

Также обратите внимание, что я перевел !(... -match ...) на более простой ... -notmatch ...; большинство операторов PowerShell имеют отрицательные формы с -not*.

. Цель этого параметра - повысить читаемость регулярных выражений с помощью :

  • , позволяющий вам использовать пробел для удобного для человека форматирования , без того, чтобы этот пробел стал частью того, что должно быть сопоставлено. Пробелы, которые вы хотите сопоставить, должны сигнализировать явно, например, с помощью \ , [ ] или \s.

  • , включая (однострочный) комментарии , с префиксом #; Затем вы должны избежать дословно # символов. как \#.

Простой пример:

# Yields $true
'foo1' -match '(?x)
  fo+  # word part
  \d?  # optional trailing digit
  $    # and nothing else
'
3 голосов
/ 19 января 2020

Одним из самых простых подходов к достижению того, что вы ищете, является использование многострочной строки и удаление символа возврата и новой строки из строки.

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

$str = @'
e|_eld\.s
od_eld\.s|
oe_eld\.s|
of_eld\.s|
og_eld\.s|
1c_eld\.s|
2c_eld\.s|
3c_eld\.s|
4c_eld\.s|
1c_eld\.s|
o2_eld\.s|
o3_eld\.s|
o4_eld\.s|
o5_eld\.s
'@ -replace "\r?\n", ''


if (!($_ -match $str)) {
    # stuff
}

Ссылки

О специальных символах (`r`n)

О правилах цитирования (многострочные строки)

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