J'ai besoin d'extraire des mots de ceci:
\[(\[\w*\])+\]
Résultat:
[hello] [world]
J'ai essayé:
[[hello] hello [world] world]
Mais cette expression pour un seul mot, j'ai besoin de quelques mots
3 Réponses :
Si je comprends bien, vous voulez faire correspondre le contenu entre crochets, ce qui se produit lui-même dans une paire de crochets.
Je suggérerais d'utiliser l'anticipation, de sauter toute autre paire de parenthèses autonomes et de rechercher une parenthèse de fermeture supplémentaire. Si cela est trouvé, alors la correspondance compte:
\ [[^ [\]] + \] (? = [^ [\ ]] * (\ [[^ [\]] + \]) * [^ [\]] * \])
Impressionnant! Merci!
pas un texte regexr équilibré, s'il ne se soucie que du côté droit, comment peut-il correspondre entre crochets, je veux dire bien, oui? pourquoi soumettre en tant que aqnsw4er? correspond à « [asfd] ]» et ne correspondra pas à «[asfd] []]» même s'il ne se trouve pas à l'écart.
En effet, cette réponse suppose que l'entrée a des crochets équilibrés.
Si 2 étapes vous conviennent, essayez ceci (version corrigée):
String s = "[[hello1] hello [world1] world]";
String t = s.replaceAll("^\\[(.+)\\]$","$1");
String result = t.replaceAll("([^\\[\\]]+)(\\[|$)","\n$2");
System.out.println(t);
System.out.println(result);
Les correspondances de l'expression régulière suivante extrairont les chaînes d'intérêt.
(?: : begin non-capture group
^ : match beginning of string
.*?\[ : match 0+ characters, lazily, then '['
| : or
\G : assert position at the end of the previous match or the
start of the string for the first match
) : end non-capture group
[ \w+]* : match 0+ characters in character class
\K : forget everything matched so far and
\[ : match '['
[ \w+]* : match 0+ characters in character class
\] : match ']'
(?= : begin positive lookahead
[ \w+]* : match 0+ characters in character class
(?: : begin non-capture group
\[ : match '['
[ \w+]* : match 0+ characters in character class
\] : match ']'
[ \w+]* : match 0+ characters in character class
) : end non-capture group
* : execute non-capture group 0+ times
\] : match ']'
) : end positive lookahead
Cela devrait fonctionner avec tous les moteurs d'expression régulière prenant en charge \ G et \ K (définis ci-dessous ), qui inclut PCRE (PHP), Perl, Ruby, le module regex de Python, entre autres.
Le moteur regex effectue les opérations suivantes.
(?:^.*?\[|\G)[ \w+]*\K\[[ \w+]*\](?=[ \w+]*(?:\[[ \w+]*\][ \w+]*)*\])
Cela affirme que les parenthèses sont équilibrées entre les crochets englobants (mais pas partout dans la chaîne).
Qu'avez-vous essayé et quel est exactement le problème?
@jonrsharpe j'ai essayé [([\ w *]) +] mais cette expression pour un seul mot entre crochets
Cela semble fonctionner pour votre exemple. Vous ne voulez pas seulement un mot? Donnez un exemple reproductible minimal pour expliquer le problème réel.
@jonrsharpe je ne sais pas comment créer une expression pour quelques mots
Pourquoi pas
\ [[^ [\]] +? \]? Ou ne spécifiez-vous pas le modificateurg, qui vous donnerait toutes les correspondances?@trincot non, besoin d'une expression pour extraire les mots entre crochets uniquement entre autres crochets
@ WiktorStribiżew, qui référencé Q&R ne traite pas de l'exigence supplémentaire des crochets externes.
@trincot Ok, j'ai doublé la vérification, mais notez que vous n'avez pas besoin de quantificateurs paresseux dans votre solution.
En effet, ils sont un vestige d'une version antérieure. Mettra à jour. Merci.
Je suppose que cela peut faire partie d'une chaîne (par exemple,
"Dites [bonjour] ou [[bonjour] bonjour [monde] monde] ou les deux"). Correct?quand vous dites
besoin d'une expression pour extraire les mots entre crochets uniquement dans d'autres crochetsvous vous référez immédiatement au texte équilibré . pourquoi utiliser une regex du tout, ou même essayer à moins d'utiliser le bon moteur qui fait cela, vous ne dites pas, oui? mais regardez yuio obtenu 2 tentatives, les deux échouent, pourquoi?