1
votes

Expression régulière Java pour extraire le contenu entre crochets ou crochets

J'essaie d'extraire une chaîne dans un carré ou un rond. La chaîne peut n'avoir que des crochets ou des crochets ronds

J'utilise l'expression régulière ci-dessous.

Pattern p = Pattern.compile ("\\ [(. *?) \\] | \ \ ((. *?) \\) ");

La chaîne de sortie comprend également des crochets. Voici le code.

String example = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("\\[(.*?)\\]|\\((.*?)\\)");
Matcher m = p.matcher(example);
while(m.find()) {
    System.out.println(m.group(1));
}

Le modèle ci-dessus donne la sortie comme

(xxxxx)

(aaaa)

Le résultat attendu est

xxxxx

aaaa


1 commentaires

Le groupe 1 doit imprimer null deux fois. Le groupe 2 aura la sortie dont vous avez besoin dans ce cas.


3 Réponses :



7
votes

Vous pouvez écrire une expression régulière qui n'a pas besoin d'avoir d'alternance et qui ne peut avoir qu'un seul groupe auquel vous pouvez accéder de manière unique pour obtenir la valeur et encore mieux si vous utilisez des analyses positives pour simplement capturer votre valeur prévue à l'aide de cette expression régulière, XXX

Explication:

  • (? - Regard positif derrière pour s'assurer que le caractère précédent est soit ( soit [
  • [^ () [\]] * - Correspond à n'importe quel caractère sauf les parenthèses ouvrantes ou fermantes
  • (? = [) \]]) - Regard positif pour s'assurer qu'il correspond soit à ) soit à

Démo

Exemples de codes Java,

xxxxx
yyyyy

Impressions,

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("[(\\[]([^()\\[\\]]*)[)\\]]");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

Alternativement, comme je l'ai mentionné ci-dessus, vous pouvez utiliser ce non- regardez autour de regex et capturez uniquement le groupe1 pour obtenir votre contenu car cette expression régulière n'a pas d'alternance donc un seul groupe.

[([]([^()[\]]*)[)\]]

Démo sans lookaround regex

Exemple de code Java avec non-look around regex là où vous avez besoin pour capturer en utilisant group(1)

xxxxx
yyyyy

Prints,

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("(?<=[(\\[])[^()\\[\\]]*(?=[)\\]])");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}


0 commentaires

3
votes

Voici un exemple complet pour vous.

public class ExtractContentExample {

    private static final Pattern PATTERN2 = Pattern.compile("^[^\\(]{0,}\\(|([\\)][^\\(\\)]{1,}[\\(])|\\)[^\\)]{0,}$");

    public void test22212 () {
       String[] split = PATTERN2.split("(I )Comparison_(am )_AND_(so )_2019-01-28Comparison_(handsome!)");
       for (int i = 0; i< split.length; i++) {
           if (split[i] != null && !split[i].isEmpty()) {
               System.out.println(split[i]);
           }
       }
   }

}

J'espère que cela vous aidera


1 commentaires

Votre modèle donne un résultat partiel si la chaîne contient un espace entre Ex: "Comparison_ (xxxx, xxxx, xxxx) _AND_ (yyyy, yyyy, yyyy) _2019-01-28". Donne la sortie xxxx au lieu de xxxx, xxxx, xxxx