Maison >Java >javaDidacticiel >Comment diviser des chaînes délimitées par des virgules avec des guillemets intégrés ?

Comment diviser des chaînes délimitées par des virgules avec des guillemets intégrés ?

DDD
DDDoriginal
2024-12-07 08:11:11194parcourir

How to Split Comma-Delimited Strings with Embedded Quotes?

Diviser le texte délimité avec des guillemets intégrés

Lors de l'analyse de texte qui suit un format délimité par des virgules, la gestion des guillemets intégrés peut poser un défi. Cet article aborde ce problème en proposant une solution pour diviser une chaîne en virgules tout en préservant l'intégrité du texte placé entre guillemets.

Considérez le texte suivant :

123,test,444,"don't split, this",more test,1

Utilisation de la chaîne de base. La méthode split(",") donnerait le résultat suivant :

123
test
444
"don't split
 this"
more test
1

Cependant, l'objectif est de conserver le texte cité comme un seul entité :

123
test
444
"don't split, this"
more test
1

Pour y parvenir, nous utilisons une solution basée sur une expression régulière :

str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

Cette expression divise la chaîne en fonction de virgules suivies d'un nombre pair de doubles citations. Cela garantit que les virgules dans le texte cité sont ignorées en tant que délimiteurs.

Comprendre l'expression régulière :

  • ,(?=( - Correspond à une virgule suivie d'un assertion anticipée.
  • (?:[^"]*"[^"]*")* : correspond à zéro ou plusieurs répétitions du modèle de texte cité suivant : "[^"]*" (un guillemet simple suivi de caractères autres que des guillemets, suivi d'un autre guillemet).
  • [^"]* : correspond à zéro ou plusieurs caractères sans guillemets. caractères avant les guillemets.
  • $[^"]*$ : affirme que la fin de la chaîne est atteinte après une correspondance sans guillemets caractères.

Syntaxe alternative :

Pour plus de lisibilité, vous pouvez également diviser l'expression régulière en plusieurs lignes à l'aide du modificateur (?x) :

String[] arr = str.split("(?x)   " + 
                     ",          " +   // Split on comma
                     "(?=        " +   // Followed by
                     "  (?:      " +   // Start a non-capture group
                     "    [^\"]* " +   // 0 or more non-quote characters
                     "    \"     " +   // 1 quote
                     "    [^\"]* " +   // 0 or more non-quote characters
                     "    \"     " +   // 1 quote
                     "  )*       " +   // 0 or more repetition of non-capture group (multiple of 2 quotes will be even)
                     "  [^\"]*   " +   // Finally 0 or more non-quotes
                     "  $        " +   // Till the end  (This is necessary, else every comma will satisfy the condition)
                     ")          "     // End look-ahead
                         );

Cette approche garantit une division précise du texte délimité, en tenant compte à la fois des virgules et des guillemets intégrés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn