6
votes

Regex capturent chaque occurrence d'un mot dans les deux délimiteurs

Dites que j'ai une longue chaîne de texte, et je veux capturer chaque fois que le mot ceci est mentionné dans les supports arrondis. Comment pourrais-je faire ça? Le modèle suivant ne correspond que le premier ceci , ignorant chaque occurrence après: xxx

par exemple, en utilisant le motif ci-dessus sur le texte suivant:

etiam scelérisque, Nunc AC ESGEAS Cadifa, (ODIO Ceci NIBH EUISMOD NULLA, EGET ARTICOR ORCI NIBH VEL NISI NISI. Aliquam Ceci Erat Volutpat).

retournera uniquement le premier ce après le mot ODIO .

Qu'est-ce que je fais mal? < / p>


3 commentaires

à la valeur faciale, je ne vois rien de mal avec ce modèle ... Postez le code que vous l'utilisez dans


OK, il y a donc 3 "ceci" dans votre exemple de texte. Alors quelle est la sortie attendue ?? Voulez-vous que le nombre de "ceci" dans ces supports? Ou voulez-vous juste retourner quoi que ce soit entre ces supports? Décrivez clairement ce que vous voulez comme sortie


+1 UTI LINGUA LATINA. :)


4 Réponses :


11
votes

Tout d'abord, ne soyez pas gourmand.

/ \ (. *? (this). *? \) / g

Deuxièmement, si vous visez à compter le nombre d'occurrences de "Ceci", une regex n'est probablement pas le bon outil ici. Le problème est que vous devez faire correspondre le délimiteur de clôture afin de déterminer que le premier "ceci" est joint, ce qui signifie que continuer à appliquer la regex ne correspond à rien à l'intérieur de cet ensemble déjà consommé de délimiteurs.

La regex que j'ai ci-dessus attrapera des choses comme:

foo (Baz this bar) (foo this)

mais non (il ne correspondra que deux fois, une fois pour chaque ensemble de délimiteurs):

foo (ceci ce bar) baz (celui-ci ceci)

Essayez d'utiliser un simple scanner à une seule passe au lieu d'une regex. Une autre alternative consiste à utiliser deux expressions régulières, une pour séparer la chaîne en sections fermées et non fermées, et une autre pour rechercher dans les régions fermées.


0 commentaires

1
votes

L'utilisation de . * code> va correspondre à chaque personnage de votre chaîne de recherche. Alors, qu'est-ce que vous faites en réalité ici, c'est gênement tout correspondant avant et après la première occurrence de ce code> trouvé dans des parenthèses. Vos résultats de correspondance actuels ont probablement l'air un peu comme les éléments suivants:

# Match everything inside the parentheses
/\([^\)]*\)/

# Match all occurrences of the word 'this' inside a substring
/this/g


0 commentaires

0
votes

J'ai implémenté la regex pour joindre tous les caractères alphanumériques à l'aide de RegEx ci-dessous: xxx

espère que cela aide.


0 commentaires

-2
votes

(this)

La chaîne ci-dessus fonctionne pour moi, essayez ceci sur http://regex101.com


0 commentaires