L'effondrement et de la Capture d'un Motif répété dans une Seule Regex Expression

Je continue cogner dans des situations où j'ai besoin d'obtenir un certain nombre de jetons à partir d'une chaîne et après d'innombrables essais, je ne pouvais pas trouver un moyen de simplifier le processus.

Disons donc que le texte est:

début:test-test-lorem ipsum-sir-doloret-etc-etc-chose:la fin

Cet exemple a 8 éléments à l'intérieur, mais dire qu'il pourrait avoir entre 3 et 10 points.

J'avais idéalement comme quelque chose comme ceci:

start:(?:(\w+)-?){3,10}:end agréable et propre, MAIS il ne saisit du dernier match. voir ici

J'ai l'habitude d'utiliser quelque chose comme cela dans des situations simples:

start:(\w+)-(\w+)-(\w+)-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?-?(\w+)?:end

3 groupes obligatoires et un autre de 7 en option en raison de la max 10 limite, mais cela n'a pas l'air "sympa" et ce serait une douleur à écrire et à suivre si la limite est de 100, et les matchs ont été plus complexe. démo

Et le meilleur que j'ai pu faire jusqu'à présent:

start:(\w+)-((?1))-((?1))-?((?1))?-?((?1))?-?((?1))?-?((?1))?-?((?1))?:end

plus courte, surtout si les matches sont complexes, mais encore long. démo

Quelqu'un a réussi à le faire fonctionner comme un 1 regex seule solution sans programmation?

Je suis surtout intéressé sur la façon dont cela peut être fait en PCRE mais d'autres saveurs serait ok aussi.

Mise à jour:

Le but est de valider un match et de capturer des jetons à l'intérieur de match 0 par RegEx seul, sans OS/logiciel/Logiciel de Programmation de Langue limitation

Mise à jour 2 (bounty):

Avec @nhahtdh de l'aide, je suis arrivé à l'expression régulière ci-dessous en utilisant \G:

(?:start:(?=(?:[\w]+(?:-|(?=:end))){3,10}:end)|(?!^)\G-)([\w]+)

démo encore plus court, mais peut être décrit sans la répétition du code

Je suis aussi intéressé par l'ECMA saveur et comme il ne supporte pas \G demandais si il y a une autre façon, surtout sans l'aide de /g modificateur.

  • Les expressions régulières sont vraiment conçus pour la reconnaissance de motifs, mais vous essayez de l'utiliser pour un changement de tendance. Vous ne dites pas quel système d'exploitation vous êtes sur mais un Awk (Unix/Linux) ou Powershell (Windows) serait probablement faire ce que vous devez faire...
  • mis à jour le post pour clarifier, la recherche d'une façon intelligente d'utiliser les RegEx dans des situations complexes, sans l'utilisation d'un logiciel d'assistance
  • non, vous ne pouvez pas faire général des choses comme ça en JS dans un seul match/étape. Les seules façons de faire qui sont dans: .NET (capture de répéter le contenu de groupe), ou avec la regex saveurs qui prennent en charge \G (ou similaire fonctionnalités de l'API).
InformationsquelleAutor CSᵠ | 2013-03-07