Maison  >  Article  >  Java  >  Comment diviser des chaînes en préservant les délimiteurs ?

Comment diviser des chaînes en préservant les délimiteurs ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 18:19:03861parcourir

How to Split Strings Preserving Delimiters?

Diviser des chaînes avec des délimiteurs conservés

Lorsque vous travaillez avec des chaînes multilignes, il devient souvent nécessaire de les diviser en leurs composants à l'aide de délimiteurs. Cependant, le comportement par défaut de String.split() supprime les délimiteurs, ne laissant que le texte extrait.

Problème :

Considérez la chaîne suivante :

(Text1)(DelimiterA)(Text2)(DelimiterC)(Text3)(DelimiterB)(Text4)

Diviser cette chaîne à l'aide de String.split() donne :

  • Texte1
  • Texte2
  • Texte3
  • Texte4

Résultat souhaité :

Pour conserver les délimiteurs et diviser la chaîne en conséquence, nous avons besoin d'une approche qui préserve les délimiteurs.

Solution :

Le JDK fournit un moyen d'y parvenir en utilisant les fonctionnalités d'expression régulière (regex) d'anticipation et d'anticipation. Voici comment cela fonctionne :

<code class="java">System.out.println(Arrays.toString("a;b;c;d".split("(?<=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("(?=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("((?<;=;)|(?=;))")));</code>

Il en résulte le résultat suivant :

  • [a;, b;, c;, d]
  • [a , ;b, ;c, ;d]
  • [a, ;, b, ;, c, ;, d]

La dernière sortie s'aligne sur le format souhaité, où chaque délimiteur est conservé et la chaîne est divisée en parties distinctes.

Explication Regex :

  • (?<=;) : recherche un point-virgule derrière et sélectionne un espace réservé de largeur nulle avant lui.
  • (?=;) : recherche un point-virgule et sélectionne un espace réservé de largeur nulle après celui-ci.
  • ((?<;= ;)|(?=;)) : Un groupe qui correspond soit à un espace réservé de largeur nulle avant un point-virgule, soit après un point-virgule.

En combinant ces modèles, nous divisons efficacement la chaîne à chaque délimiteur tout en préservant le délimiteur lui-même dans le cadre de la sortie.

Améliorations de la lisibilité :

Pour une meilleure lisibilité, envisagez d'utiliser des expressions régulières nommées comme suit :

<code class="java">static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";

public void someMethod() {
    final String[] aEach = "a;b;c;d".split(String.format(WITH_DELIMITER, ";"));
    ...
}</code>

Cela rend l'expression régulière plus explicite et plus facile à maintenir.

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