2017-03-31 2 views
0

Première: Iknowthisquestionhasbeenbeatentodeath.Capturer un groupe répété vs répétition d'un groupe de capture au milieu d'un regex complexe

Deuxième: Je l'ai regardé toutes les ressources (éditeurs en ligne, RexEgg, regular-expressions.info etc ...) Je peux penser au cours des dernières années et je ne peux toujours pas saisir cette partie de regex. Cela ne semble jamais fonctionner pour moi, peu importe ce que j'utilise RegEx.

Maintenant que la maison est tenue hors du chemin:

J'ai une grande quantité de texte que je dois extraire des données à partir de ce que je pense Regex est bien adapté.

Le texte ressemble à ceci:

2017-03-31 09:41:18 EDT [12708-4] paramètres: 1 $ = '0', $ 2 = 'ON', $ 3 = « ON '

de manière assez évidente, je veux les valeurs $1, $2 et $3. Cet exemple particulier a 3 variables, mais il est généralement compris entre 1 et 15.

Je veux un regex qui captera les suivantes:

  1. $ '0'
  2. $ 2
  3. « ON '
  4. $ 3
  5. 'ON'

Ceci est mon regex, qui correspond au premier groupe:

\d{4}.+\[[\d-]*\].+?parameters:\s((\$\d+)\s?=\s?(['\d+\w+]+))

mais aucune combinaison de points positifs, entre parenthèses et des virgules tout près de ce que produit des que je veux. Même si j'enlève les virgules de la ficelle et que je les coince ensemble, je ne peux pas l'attraper.

Ce type capture tout, mais les groupes ne font pas de sens:

\d{4}.+\[[\d-]*\].+?parameters:\s(((\$\d+)\s?=\s?(['\d+\w+]+),?\s?)+)

Quelqu'un peut-il mettre fin à ma misère ici et me expliquer comment capturer le texte répété dans un regex si le texte est séparé par des personnages dont je ne me soucie pas?

+1

Vous pourriez jeter un oeil à' \ G 'qui correspond à la position, la correspondance précédente terminée.' (?: \ G (?! ^), | paramètres:) \ s + (\ $ \ d +) = '(\ w +)' 'devrait être quelque peu ce que vous êtes –

+0

Je ne pouvais pas obtenir celui-ci pour travailler.Encore seulement en capturer un – Brandon

+0

Essayez de multiples saisies/capturer des mentions de Sebastian avec un motif peu modifié: ['(?: \ G (?! ^), | paramètres :) \ s * (\ $ \ d +) \ s * = \ s * '([^'] +) '\ s * '] (https://regex101.com/r/3nHI53/1). vous donnez 6 groupes, car il ne peut y avoir que le nombre de groupes définis dans le modèle, ce qui donne 3 groupes x 2 groupes dans chaque groupe, si cette approche n'est pas ce dont vous avez besoin, vous ne pouvez pas l'obtenir avec une regex pure. W quel est le langage de programmation? –

Répondre

0

Je vous suggère d'utiliser se regex pour extraire chaque valeur définie comme celui-ci (\$\d) = '(.+?)'example

boucle Vous pouvez ensuite à travers tous les matches. Le groupe 1 sera le label (ie $ 1) et le groupe 2 sera la valeur (ie 0)


Juste un petit avertissement, je pense, vaut la peine d'être mentionné: "Un groupe de capture répété ne capturera que la dernière itération .Placez un groupe de capture autour du groupe répété pour capturer toutes les itérations ou utilisez un groupe non-capturant à la place si vous n'êtes pas intéressé par les données »(comme noté sur regex101)

+0

Il y a beaucoup plus de choses sans rapport avec le problème qui m'empêche de capturer les deux groupes séparément. Je suis conscient qu'il ne capturera que la dernière itération. J'ai essayé de contourner le problème en mettant un groupe de capture autour du groupe répété mais cela n'a pas fonctionné. – Brandon