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
3 Réponses :
@RachanRK Où avez-vous mentionné cela dans votre question?
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 à 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.
[([]([^()[\]]*)[)\]]
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());
}
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
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
Le groupe 1 doit imprimer
nulldeux fois. Le groupe 2 aura la sortie dont vous avez besoin dans ce cas.