J'aimerais correspondre à tous les C'est ce que j'ai essayé: Le problème est qu'il ne correspond que la dernière barre J'ai fait de mon mieux en essayant de rechercher comment résoudre ce problème, mais je ne pouvais rien retrouver, alors je demande ici. P>
Mon regex actuel afin que vous puissiez comprendre ce que je veux dire mieux: https://regex101.com/r / p0tqws / 1 p> FOO code> et bar code> (Ceux qui ne sont entre 8 code> caractères) dans ce texte foo Bar FOO 8 BAR FOO BAR 8 FOO BAR FOO CODE>. P>
8. * (foo | bar). * 8 code> p>
code> comme (je crois) le quantificateur gourmand va aussi loin que possible. p>
4 Réponses :
voir REGEX101 pour explication p>
C'était le problème, en substance: p>
Un groupe de capture répété ne fera que capturer la dernière itération. Mettez un groupe de capture autour du groupe répété pour capturer toutes les itérations ou utiliser un groupe de non-capture plutôt que si vous n'êtes pas intéressé par les données p>
blockQuote> 8 ([^ 8] * (foo | bar) + [^ 8] *) 8 code> p>
Hey, merci pour votre réponse. Cependant, cela ne semble pas être ce que je veux. Je voudrais foo code> et bar code> pour être des correspondances différentes, ce qui ne semble pas être le cas ici.
Une alternative à une capture de regex serait un divisé code> et carte code> ou une fonction de tableau similaire:
Vous pouvez correspondre au premier Si vous voulez les parties séparées, vous pouvez diviser les données du groupe 1 sur un espace. P> Démo Regex P> P> 8 code>, puis capturer dans le groupe 1 Ce qui est entre la deuxième occurrence de 8 et utilisez un lookahead positif si vous souhaitez également obtenir une autre occurrence de 8 Suivant. \b8\s+(.+?)(?=\s+8\b)
\ b8 code> match 8 précédé d'un mot ballaire li>
\ s + code> match 0+ caractères blanchissions li>
([^ 8] +) code> Capture Group 1, correspond à n'importe quel caractère sauf 8 code> 1 fois fois li>
(? = code> lookahead positif
\ s + 8 \ b code> Match 0+ caractères blancheurs et match 8 suivi d'une limite de mot li>
ul> li>
) code> Fermer Lookahead li>
ul> const pattern = /\b8\s+([^8]+)(?=\s+8\b)/;
let str = "foo bar foo 8 bar foo bar 8 foo bar foo";
str = str.match(pattern)[1].split(" ");
console.log(str);
(Lorsque vous essayez dans REGEX 101, il semble que cela permet d'autoriser la largeur non correction de largeur dans JavaScript. Si cela fonctionne pour vous, vous pouvez essayer ceci)
Si votre environnement permet un look non-fix-largeur -behind, vous pouvez essayer p>
Il est toujours bon de marquer vos questions avec votre langue, d'autant plus de différences entre différents moteurs de regex. Ce problème est relativement facile à résoudre en PHP, beaucoup plus difficile dans JS.
Peut-il y avoir des mots autres que
foo code> etbar code> entre le8 code> S?@Nick Oui, il peut essentiellement être n'importe quoi
Les choses seront plus faciles si la longueur variable est disponible mais que ce n'est pas possible dans JavaScript. A-t-il besoin d'être une solution pure regex?