1
votes

Expression régulière pour tableau de mots entre crochets

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


11 commentaires

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 modificateur g , 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 crochets vous 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?


3 Réponses :


0
votes

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:

\ [[^ [\]] + \] (? = [^ [\ ]] * (\ [[^ [\]] + \]) * [^ [\]] * \])


3 commentaires

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.



0
votes

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);


0 commentaires

0
votes

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

Démarrez votre moteur!

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).


0 commentaires