PowerShell regex dividido em espaço em branco único e duplo

1

Eu tenho um problema e tenho certeza de que é algo simples que estou ignorando ou não compreendo ao usar o regex e o método de alternância para correspondência de expressão para espaço em branco duplo e único .

Estou usando os metacaracteres abreviados \s|\s\s com o PowerShell -split para retornar vários objetos de strings com cada um em uma nova linha para cada espaço em branco único ou duplo, para que todo o restante esteja em sua própria divisão de linha conforme o esperado.

Exemplo de dados e comando do PowerShell

Nota: Infelizmente este é um exemplo dos dados com os quais estou trabalhando e não tenho controle sobre isso, então ele terá o single e espaço em branco duplo ambos

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

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

Resultado

Data
is
over
here

and
here
is
some
down

under
too

Resultado Esperado

Data
is
over
here
and
here
is
some
down
under
too

Especificações do ambiente

  • Windows 10 Pro X64
  • PowerShell 5.0

Pergunta

Gostaria de entender o que está acontecendo com o formato regex que estou usando com a sintaxe de alternância de caracteres meta resumida , mas eu ' Vou considerar uma solução alternativa também se eu não conseguir nada definitivo.

    
por Pimp Juice IT 14.04.2017 / 06:26

2 respostas

1

Muito obrigado a PetSerAl e, como salientado, com seu comentário: " -split '\s\s|\s' - PetSerAl "

A pegadinha

Eu acho que há uma lição importante para aprender ao usar as regex alternações e isso a ordem em que você as coloca pode importar muito .

A razão

A razão pela qual isso não funcionou foi porque a expressão estava procurando um único caractere de espaço em branco primeiro e isso era um problema, porque toda vez que ele ficava em um lugar onde havia dois espaços em branco, um era deixado por cima. Então é por isso que vi algumas linhas em branco na saída.

A solução

Eu consertei isso simplesmente mudando as posições dentro da alternância e disse para favorecer o espaço em branco duplo sobre o espaço em branco único (ou seja, use \s\s|\s e não \s|\s\s ) para dividir em dois primeiro espaços em branco e, se não houver um espaço em branco duplo, ele será dividido em um único espaço em branco.

Script de solução

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

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

Resultado

Data
is
over
here
and
here
is
some
down
under
too
    
por 15.04.2017 / 05:38
2

Use isso, o que significa uma ou mais ocorrências de qualquer caractere de espaço em branco, como guias, espaços e assim por diante:

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

Resultado:

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> 
    
por 14.04.2017 / 07:33