0
votes

Regex correspond à une chaîne indirectement liée par 2 cordes

Voici ma chaîne de test abstraite:

test de test de test

bleu

test de test de test

rouge 23

test de test de test

gris

test de test de test

bleu

test de test de test

rouge 99

test de test de test

gris - blanc

test de test de test

J'essaie de faire correspondre le texte entre le deuxième deuxième seconde "bleu" et "gris-blanc"

Fondamentalement, je analyse du code et j'ai besoin de 2 règles:

1.) Trouvez le rouge si entre "bleu" et "gris"

2.) Trouvez le rouge si entre "bleu" et "gris-blanc" * Je ne peux pas être sûr de l'ordre des strophes

Le premier n'est pas trop difficile: lien

Mais je ne peux pas comprendre la deuxième règle. Tout ce que j'ai essayé ... comme (? S) (bleu) (. *?) (gris (?! \ s + test)) ... correspond toujours au premier "bleu", au lieu de sauter dessus

est là à l'écart (. *?) dans 'mais seulement si cela ne contient pas "bleu"' '

Quelqu'un en connaît une astuce que je ne fais pas?


0 commentaires

3 Réponses :


0
votes

Je pense que vous recherchez cela en fonction de vos 2 règles bien qu'elles ne correspondent pas à votre regex. REGEX101

(blue).*?[^ ](red) .*?[^ ](grey( | - blue)?)


0 commentaires

0
votes

Ce REGEX (? S) (Bleu) (. *?) (gris (?! \ s + test)) correspondra à la partie entière entre le premier bleu et le dernier gris à cause du lookahead négatif (gris (?! \ s + test)) qui correspond au milieu et échoue au regard négatif.

Ce que vous pourriez faire est de capturer le bleu puis utilisez une correspondance gourmande pour correspondre au dernier "rouge" suivi de 1 chiffres. Utilisez ensuite un motif non gourmand pour correspondre jusqu'au premier "gris-blanc" xxx

voir le Démo Regex


0 commentaires

0
votes
(?s)(blue).*?(red).*?(grey(?: - blue)?)
The above regex matches BOTH reds... but I need to be able to tell which is which (I can't rely on their order).Let me re-write the question to clarify the objective:I need two regex, I already found an answer for 1.), but am looking for an answer for 2.):1.) Find "red XX" if between "blue" and "grey"    (match contains only red 23)2.) Find "red XX" if between "blue" and "grey - white"    (match contains only red 99)

1 commentaires

J'ai mis à jour ma réponse. Au lieu de réécrire votre question comme réponse, vous pouvez l'ajouter à la question à la place.