Question

Permettez-moi de commencer par dire que je suis un amateur absolu en matière de RegEx et que je n'ai commencé que quelques jours auparavant. J'essaie de résoudre un problème de formatage d'un fichier et j'ai rencontré un problème avec un type de données particulier. Le fichier d’entrée est structuré comme suit:

Two words,Word,Word,Word,"Number, number"

Ce que je dois faire, c'est le formater comme ceci ...

"Two words","Word",Word","Word","Number, number"

J'ai eu un motif RegEx de

s/,/","/g

fonctionne, sauf qu'il remplace également la virgule dans la section Number déjà citée de Number, ce qui entraîne la séparation du champ et la rupture du fichier. En gros, je dois modifier mon modèle pour remplacer une virgule par "," [quote virgule citation], mais uniquement lorsque cette virgule n'est pas suivie d'un espace. Notez que les autres champs n'auront jamais d'espace après la virgule, mais uniquement la liste de numéros délimités.

J'ai réussi à écrire

s/,[A-Za-z0-9]/","/g

qui, tout en faisant correspondre les chaînes appropriées, remplacerait la virgule ET la lettre suivante. J'ai entendu parler de références arrières et je pense que c'est peut-être ce que je dois utiliser? Ma compréhension était que

s/(,)[A-Za-z0-9]\b

devrait fonctionner, mais cela ne fonctionne pas.

Quelqu'un a une idée?

Était-ce utile?

La solution

s /, ([^]) / "," $ 1 / correspondra à un ", " suivi d'un "pas-un-espace", capturant le pas-un-espace, puis remplaçant le tout par la partie capturée.

Selon le moteur de regex que vous utilisez, vous écrivez peut-être \ 1 au lieu de $ 1 .

Si vous utilisez Perl ou si vous avez accès à un moteur de regex avec une anticipation négative, s /, (?!) / "," / (un ">," "Aucun espace) ne fonctionne.

Cependant, votre entrée ressemble à du CSV, et si c’est le cas, vous feriez mieux de l’analyser avec un véritable analyseur au format CSV plutôt qu’avec des regex. Il y a beaucoup d'autres cas étranges à régler.

Autres conseils

Mon expérience a été que ce n’est pas une grande utilisation des regex. Comme déjà dit, les fichiers CSV sont mieux gérés par de vrais analyseurs. Vous n'avez pas balisé une langue, donc c'est difficile à dire, mais en perl, j'utilise Text :: CSV_XS ou DBD :: CSV (ce qui me permet d'utiliser SQL pour accéder à un fichier CSV comme s'il s'agissait d'une table, ce qui, bien sûr, utilise Text :: CSV_XS sous les couvertures). Beaucoup plus simple que de rouler le mien et beaucoup plus robuste que d’utiliser des expressions rationnelles.

Cette question est similaire à: Remplacer les modèles situés à l'intérieur des délimiteurs à l'aide d'un appel d'expression régulière .

Cela pourrait fonctionner:

s/"([^"]*)"|([^",]+)/"$1$2"/g

On dirait que vous utilisez Sed.

Bien que votre modèle semble être un peu incohérent, je suppose que vous voudriez que chaque élément séparé par des virgules soit entouré de citations. Sinon, vous examinez des zones de complexité de calcul que les expressions régulières ne sont pas destinées à gérer.

Grâce à sed, votre commande serait:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Notez que vous devrez toujours mettre des guillemets doubles au début et à la fin de la chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top