Si j'ai une chaîne comme celle-ci:
FOO[BAR]
J'ai besoin d'un moyen générique pour extraire la chaîne "BAR" de la chaîne afin que peu importe la chaîne entre les crochets, elle puisse obtenir la chaîne.
par exemple
FOO[DOG] = DOG
FOO[CAT] = CAT
Vous devriez pouvoir utiliser des quantificateurs non gourmands, en particulier * ?. Vous allez probablement vouloir ce qui suit:
Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");
Cela vous donnera un modèle qui correspondra à votre chaîne et mettra le texte entre crochets dans le premier groupe. Consultez la documentation de l'API Pattern pour plus d'informations.
Pour extraire la chaîne, vous pouvez utiliser quelque chose comme ce qui suit:
Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
String s = m.group(1);
// s now contains "BAR"
}
la manière non-regex:
alternativement, pour une meilleure performance / utilisation de la mémoire (merci Hosam):
la source
lastIndexOf(']')
place, qui gérerait les crochets imbriqués. De plus, je pense que l'utilisation duindexOf(char)
serait plus rapide queindexOf(String)
.lastIndexOf
sera certainement plus rapide de trouver la parenthèse de fermeture.Voici un exemple de travail:
RegexpExample.java
Il affiche :
la source
la source
Si vous avez simplement besoin d'obtenir ce qui se trouve entre les deux
[]
, vous pouvez utiliser\[([^\]]*)\]
comme ceci:Si vous en avez besoin de la forme,
identifier + [ + content + ]
vous pouvez limiter l'extraction du contenu uniquement lorsque l'identifiant est un alphanumérique:Cela validera des choses comme
Foo [Bar]
, oumyDevice_123["input"]
par exemple.Problème principal
Le problème principal est lorsque vous souhaitez extraire le contenu de quelque chose comme ceci:
Le Regex ne fonctionnera pas et reviendra
BAR[CAT[123
etFOO
.Si nous changeons l'expression régulière en
\[(.*)\]
alors tout va bien, mais si vous essayez d'extraire le contenu de choses plus complexes comme:Aucun des Regex ne fonctionnera.
Le Regex le plus précis pour extraire le contenu approprié dans tous les cas serait beaucoup plus complexe car il faudrait équilibrer les
[]
paires et vous donner leur contenu.Une solution plus simple
Si vos problèmes deviennent complexes et que le contenu est
[]
arbitraire, vous pouvez à la place équilibrer les paires de[]
et extraire la chaîne en utilisant un ancien code plutôt qu'un Regex:C'est plus du pseudo-code que du vrai code, je ne suis pas un codeur Java donc je ne sais pas si la syntaxe est correcte, mais cela devrait être assez facile à améliorer.
Ce qui compte, c'est que ce code doit fonctionner et vous permettre d'extraire le contenu du
[]
, aussi complexe soit-il.la source
Je pense que votre expression régulière ressemblerait à:
En supposant que FOO va être constant.
Donc, pour mettre cela en Java:
la source
Cela renverra la valeur entre le premier '[' et le dernier ']'
Foo [Bar] => Bar
Foo [Bar [test]] => Bar [test]
Remarque: vous devez ajouter une vérification d'erreur si la chaîne d'entrée n'est pas bien formée.
la source
en supposant qu'aucun autre crochet fermant n'est autorisé à l'intérieur, / FOO \ [([^ \]] *) \] /
la source
Je définirais que je veux un nombre maximum de caractères non-] entre
[
et]
. Ceux-ci doivent être échappés avec des barres obliques inverses (et en Java, ils doivent être échappés à nouveau), et la définition de non-] est une classe de caractères, donc à l'intérieur de[
et]
(ie[^\\]]
). Le résultat:la source
Comme ça, son travail si vous voulez analyser une chaîne qui provient de mYearInDB.toString () = [2013] cela donnera 2013
la source
Cette expression rationnelle fonctionne pour moi:
exemple:
production:
Testé sur http://rubular.com/
la source
Cela renverra une chaîne ne prenant que la chaîne entre crochets.
Cela supprime toutes les chaînes en dehors des crochets.
Vous pouvez tester cet exemple de code java en ligne: http://tpcg.io/wZoFu0
Vous pouvez tester cette expression régulière à partir d'ici: https://regex101.com/r/oUAzsS/1
la source