2 votes

PowerShell regex division sur un seul et double espace blanc

J'ai un problème et je suis sûr que c'est quelque chose de simple que je néglige ou que je ne comprends pas en utilisant les regex et la méthode d'alternance pour la correspondance d'expressions pour les espaces blancs doubles et simples.

Je suis en utilisant les caractères de métacaractères d'abréviation \s|\s\s avec PowerShell -split pour retourner plusieurs objets de chaînes avec chacun sur une nouvelle ligne pour chaque espace blanc simple ou double donc tout le reste est sur sa propre ligne se divisant comme prévu.

Données d'exemple et commande PowerShell

Remarque: Malheureusement, c'est un exemple des données avec lesquelles je travaille et je n'ai aucun contrôle là-dessus alors cela aura le simple et double espace blanc tous les deux

$Content = "Les données sont ici
et voici aussi quelques espaces  en dessous"

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

Résultat

Les données
sont
ici
et
voici
aussi
quelques
espaces
en
dessous

Résultat Attendu

Les données
sont
ici
et
voici
aussi
quelques
espaces
en
dessous

Spécifications de l'environnement

  • Windows 10 Pro X64
  • PowerShell 5.0

Question

J'aimerais comprendre ce qui se passe avec le format regex que j'utilise avec la syntaxe d'alternance des métacaractères d'abréviation mais je vais également envisager une solution de contournement si je n'obtiens rien de définitif sinon.

4voto

Shakur Points 544

Utilisez plutôt ceci, ce qui signifie une ou plusieurs occurrences de n'importe quel caractère d'espace blanc, comme des tabulations, des espaces, et ainsi de suite :

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

Résultat :

PS C:\WINDOWS\system32> $Content = "Les données sont ici
et voici aussi quelques unes en dessous"

$Content -split "\s{1,}"
Les
données
sont
ici
et
voici
aussi
quelques
unes
en
dessous

PS C:\WINDOWS\system32>

3voto

Un grand merci à PetSerAl et comme indiqué dans son commentaire: "-split '\s\s|\s'PetSerAl"

Le Piège

Je suppose qu'il y a une leçon importante à apprendre lors de l'utilisation d'alternances regex et c'est que l'ordre dans lequel vous les mettez pourrait avoir une grande importance.

La Raison

La raison pour laquelle cela ne fonctionnait pas était que l'expression recherchait d'abord un caractère d'espace blanc unique et c'était un problème car à chaque fois qu'elle rencontrait un endroit où il y avait deux espaces blancs, l'un était laissé de côté. C'est pourquoi j'ai vu quelques lignes vides dans la sortie.


La Solution

J'ai corrigé cela en échangeant simplement les positions à l'intérieur de l'alternance et en lui disant de privilégier les doubles espaces blancs par rapport aux espaces blancs simples (c'est-à-dire j'ai utilisé \s\s|\s et non \s|\s\s) pour qu'il se divise d'abord en deux espaces blancs, et s'il n'y a pas de double espace blanc, il se divisera alors sur un espace blanc simple.

Script de Solution

$Contenu = "Les données sont ici
et voici aussi quelques éléments ci-dessous"
$Contenu

$Contenu -split "\s\s|\s"

Résultat

Les
données
sont
ici
et
voici
aussi
quelques
éléments
ci-dessous

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X