Bonjour Experts experts réguliers, P>
Il n'y a jamais eu de problème de manipulation de chaîne que je ne pouvais pas résoudre avec des expressions régulières jusqu'à présent, au moins de manière élégante en utilisant une seule étape. Voici les échantillons de données avec qui je travaille: p>
0, "Section1", "(7) Livraison de 'Certificat' en dehors des États-Unis États interdits. Depuis la section 339 du Statut de 1940, 68 / et L'article 341 de la loi actuelle est explicite dans leur déclaration que le le certificat doit être fourni le citoyen, seulement si un tel individu est à le temps aux États-Unis, il est clair que le document ne pouvait pas et ne peut pas être livré en dehors de la États-Unis. ", Http: //www.google.com/ p>
1, "Section2" , http: //www.google.com/ p>
2, "Section3", ",", http: //www.google.com/ p> blockQuote>
Il s'agit d'une section d'un fichier CSV beaucoup plus grand. Avec une expression régulière élégante, je voudrais remplacer uniquement toutes les virgules qui se produisent dans les citations doubles avec un caractère de soulignement (_). Il est important que l'expression régulière ne remplace aucune virgule en dehors des guillemets car cela gâcherait la structure de données CSV. P>
merci, Tom p>
- p>
Clarification: P>
Désolé gars, j'ai posté la question sans clarifier complètement ma situation, alors laissez-moi résumer ci-dessous: p>
- suppose que les citations dans les guillemets sont déjà échappées (citations dans les guillemets dans un fichier CSV enregistré par Excel sont représentés par
"" " code> ou
" "" code> etc. "" sont facilement remplacés à l'avance). LI>
- Je travaille dans JavaScript. Li> ul>
Utilisation du texte exemple ci-dessus, voici ce qu'il faut ressembler après avoir exécuté le remplacement d'expression régulier (il devrait y avoir un total de 5 remplacements): P>
0, "Section1", "(7) Livraison de 'Certificat' en dehors des États-Unis États interdits. Depuis la section 339 du Statut 1940 68 / et L'article 341 de la loi actuelle est explicite dans leur déclaration que le le certificat doit être fourni le citoyen_ seulement si une telle personne est à le temps au sein des États-Unis_ il est clair que le document ne pouvait pas et ne peut pas être livré en dehors de la États-Unis. ", Http: //www.google.com/ p>
1, "Section2" , http: //www.google.com/ p>
2, "Section3", "__", http: //www.google.com/ p> blockQuote>
3 Réponses :
Les expressions régulières ne sont pas particulièrement bonnes pour assortir un texte équilibré équilibré (c.-à-d. Quotes de début et de fin).
Une approche naïve serait de appliquer à plusieurs reprises quelque chose comme celui-ci (jusqu'à ce qu'il ne correspondait plus): p> < Pré> xxx pré>
mais cela ne fonctionnerait pas avec des citations évasées. La meilleure solution (c'est-à-dire la plus simple, la plus lisible et la plus maintenable) est de utiliser un analyseur de fichier CSV strong>, passez à travers toutes les valeurs de champ une à une (remplacement des virgules avec des soulignements comme vous allez), puis écrivez Retour au fichier. P> p>
Je vais vous aider, mais vous devez promettre d'arrêter d'utiliser le mot "élégant". Cela fonctionne trop difficile ces derniers temps et mérite un repos. : P
(?m),(?=[^"]*"(?:[^"\r\n]*"[^"]*")*[^"\r\n]*$)
Alan Moore, vous êtes un expert d'expression régulier :-). Sur toutes les solutions que j'ai reçues ici (et ailleurs), votre une expression super régulière a été capable de faire exactement ce que j'ai décrit dans ma question, même avant de poster ma clarification. Points bonus, et oui Votre solution est "élégante" par rapport à la solution que j'aurais proposé (nécessitant plusieurs regexples et une matrice pour un stockage temporaire).
@Alan, j'ai utilisé votre expression régulière, sauf que j'ai laissé de côté?: - Y a-t-il une autre utilisation pour cela de mémoriser le match?
@ 10Basetom: Dans de nombreuses saveurs regex, si vous utilisez des groupes de capture dans la fentage de regex, tout ce qu'ils capturent sont ajoutés aux résultats ainsi que les jetons réguliers. Mais j'avoue que je ne pensais même pas à cela à l'époque. Je suis juste à la suite de la règle de base: n'utilisez jamais un groupe de capture si un groupe de non-capture peut faire le travail. Chaque groupe de capture supplémentaire ajoute un peu plus aux frais généraux de la ressource, à la fois du matériel et du matériel de ménage (c'est-à-dire qu'il devient plus difficile pour vous l'auteur de garder une trace de laquelle le groupe capture).
@Alan Moore: Merci pour l'entrée. J'ai eu la même pensée que vous («chaque groupe de capture supplémentaire ajoute un peu plus à la générale des ressources») et a décidé de rester?: - Même si des économies sont triviales, elle ne fait jamais de mal à l'ajouter.
Y a-t-il un moyen de faire fonctionner cette regex avec la fonction de remplacement JavaScript?
@KNIX: /, (? = [^ "] *" (?: [^ "\ R \ n] *" [^ "] *") * [^ "\ r \ n] * $ / mg code> devrait le faire. La seule chose que JavaScript s'opposerait à ce que le modificateur inline,
(? m) code>; i utilisé
/ m code> et le "global". Modificateur,
/ g code>, dit-le de remplacer toutes les correspondances, pas seulement du premier.
@Alan, je devais juste jeter une parens de plus et ça a fonctionné magnifiquement! Merci! /, (? = [^ "] *" (?: [^ "\ r \ n] *" [^ "] *") * [^ "\ r \ n] * $) / mg Code>
Excusez-moi si vous n'utilisez Python, dans lequel est le code suivant.
Je n'ai vu aucune indication dont vous utilisez la langue. Quoi qu'il en soit, je pense que le code est parfaitement compréhensible. Cette méthode conserve les 2 virgules adjacentes dans la ligne P> 1, "Section2" , http: // www .google.com / P> inchangé.
Est-ce la bonne chose que vous voulez? P> p>
Comment évacuez-vous des citations dans les citations?
@Assaf, bonne question; S'il vous plaît voir ma clarification ci-dessus.