Maison > Java > javaDidacticiel > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-24 18:19:03
original
923 Les gens l'ont consulté

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)
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal