windows - Hvordan kan jeg skrive en regex for gentagne gange at fange gruppe inden for en større kamp?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg får en regex hovedpine, så forhåbentlig kan nogen hjælpe mig her. Jeg laver en filsyntaxomvandling, og jeg har denne situation i filerne:


OpenMarker
    keyword some expression
    keyword some expression
    keyword some expression
    keyword some expression
    keyword some expression
CloseMarker


Jeg vil matche alle forekomster af 'søgeord' inde i markørerne. Markørområderne gentages, og søgeordet kan vises på andre steder, men jeg ønsker ikke at matche uden for markørerne. Hvad jeg ikke synes at kunne udrette, er, hvordan man får en regex til at trække alle de Tændstikker. Jeg kan få en til at gøre det første eller det sidste, men ikke for at få dem alle. Jeg tror, ​​det burde være muligt, og det er noget at gøre med gentagne fangstgrupper - kan nogen vise mig lyset?


Jeg bruger grepWin, som synes at understøtte alle klokker og fløjter.

Bedste reference


Du kan bruge:


(?<=OpenMarker((?!CloseMarker).)*)keyword(?=.*CloseMarker)


Dette stemmer overens med keyword indenfor OpenMarker og CloseMarker (ved hjælp af indstillingen 'prik matches newline').

Andre referencer 1


sed -n -e '/OpenMarker[**:space:**]*CloseMarker/p' /path/to/file | grep keyword bør arbejde. Ikke sikker på, om grep alene kunne gøre dette.

Andre referencer 2


Der er kun få regexmotorer, som understøtter separate optagelser af en gentagen gruppe (.NET for eksempel). Så din bedste indsats er at gøre dette i to trin:


Match først det afsnit, du er interesseret i: OpenMarker(.*?)CloseMarker (ved hjælp af indstillingen 'prik matches newline').


Anvend derefter en anden regex til kampen gentagne gange: keyword (.*) (denne gang uden valgmuligheden 'prik matches newline').