1

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

Я использую сокращенные метасимволы \s|\s\s с PowerShell -split для возврата нескольких строковых объектов, каждый из которых находится на новой строке для каждого одинарного или двойного пробела, так что все остальное находится на отдельной строке, как и ожидалось.

Пример данных и команда PowerShell

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

$Content = "Data is over here
and here is some down  under too"

$Content -split "\s|\s\s"

Результат

Data
is
over
here

and
here
is
some
down

under
too

ожидаемый результат

Data
is
over
here
and
here
is
some
down
under
too

Спецификации окружающей среды

  • Windows 10 Pro X64
  • PowerShell 5.0

Вопрос

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

2 ответа2

2

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

$Content -split "\s{1,}"

Результат:

PS C:\WINDOWS\system32> $Content = "Data is over here
and here is some down  under too"

$Content -split "\s{1,}"
Data
is
over
here
and
here
is
some
down
under
too

PS C:\WINDOWS\system32> 
1

Большое спасибо PetSerAl и, как указано в его комментарии: " -split '\s\s|\s' - PetSerAl "

Гоча

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

Причина

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


Решение

Я исправил это, просто переключив позиции внутри чередования, и сказал, чтобы он отдавал предпочтение двойному пробелу над одним пробелом (т. Е. Использовал \s\s|\s а не \s|\s\s), поэтому он разделяется на два пробела. во-первых, и если нет двойного пробела, он будет только потом разделен на один пробел.

Сценарий решения

$Content = "Data is over here
and here is some down  under too"
$Content

$Content -split "\s\s|\s"

Результат

Data
is
over
here
and
here
is
some
down
under
too

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .