5 votes

Regex - correspondance des espaces avant et arrière, des espaces entre les parenthèses ouvrantes et fermantes et les mots, mais pas entre les mots.

Je m'excuse si cette question a déjà reçu une réponse, mais j'ai cherché et je ne trouve pas la réponse. J'essaie d'écrire une expression rationnelle qui correspondra à tous les espaces avant et arrière, aux espaces entre les crochets ouvrants et fermants et au mot, mais pas aux espaces entre les mots. Voici des exemples de format de chaîne de caractères des données que j'analyse :

[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       
  • pas d'espace avant et arrière, pas d'espace entre les parenthèses et un seul mot.

  • un espace avant et arrière, un espace entre la parenthèse ouvrante et un espace arrière.

  • un espace avant, un espace entre le mot et les chiffres, un espace entre la parenthèse ouvrante et la parenthèse fermante, et un espace arrière.

La plus proche regex que j'ai trouvée est :

/[^\[\]a-zA-Z\d]/

Mais je n'arrive pas à démêler uniquement les espaces entre les mots et les chiffres...

Le code ruby que j'utilise actuellement comme solution de rechange est le suivant :

line.gsub!(/^\s*/, "")
line.gsub!(/\[/, "")
line.gsub!(/\]/, "")
s = line.gsub!(/^\s*|\s*$/, "")
s = "[" + s + "]\n"

Évidemment, pas très jolie...

Toute aide pour rationaliser cela dans une ligne gsub élégante est grandement appréciée.

Merci !

Lee

3voto

Jon Gauthier Points 10173

Si je comprends bien votre question, vous essayez de transformer ce texte

[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       

dans ceci :

[Header]
[SomeSpace]
[Some1 More Space 15]

Cette regex fera l'affaire. L'ajout clé ici est l'ajout non gourmand ? sur la classe de caractères interne. Cela permet à la classe de caractères de correspondre aussi peu que possible et laisse l'espace de fin entre les parenthèses (s'il y en a un) pour l'avidité suivante \s* .

s/^\s*\[\s*([\w\s]*?)\s*\]\s*$/[$1]/g

Ruby :

line.gsub! /^\s*\[\s*([\w\s]*?)\s*\]\s*$/, '[\\1]'

sed (laid et très probablement non performant..). Je ne suis pas sed maître !)

sed -Ee "s/^ *\[([a-zA-Z0-9 ]+)\] *$/\\1/g" -e "s/^ */[/g" -e "s/ *$/]/g" infile

0voto

nhahtdh Points 28167

Regex pour faire correspondre tous les espaces supplémentaires pour le remplacement :

/(?<=^|\[)\s+|\s+(?=$|\])|(?<=\s)\s+/
  • La première partie correspondra à tous les espaces de tête au début et à l'intérieur des parenthèses.
  • La deuxième partie correspondra à tous les espaces de fin et à l'intérieur des crochets.
  • La dernière partie détectera les séquences de 2 espaces ou plus et supprimera les espaces supplémentaires.

Il suffit de remplacer les correspondances par une chaîne vide.

Données d'essai

    [Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       
   [    Super    Space     ]     
  [    ]
  [ ]
   []
[a]
[a ]
[ a]
[   a   ]
[a a]
[a   a   a      a a  b]   [   dasdasd   dsd   ]

0voto

pguardiario Points 19925

Je ne sais pas si elle est élégante, mais la plus simple est probablement la plus simple :

line.gsub /^\s*(\[)\s*|\s*(\])\s*$/, '\\1\\2'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X