One-liner om meerdere patroonovereenkomsten te verzamelen en tegelijkertijd te verwijderen

Ik heb een aantal strings die er als volgt uitzien:

str = 'CA3 03223-DG 0101-CA2 0101-CA1 0101 pyramidal cells c (PC-c)'

Dat wil zeggen, er zijn een aantal met koppeltekens gescheiden leidende strings zoals "CA3 03223" gevolgd door enkele woorden (in het voorbeeld hierboven, "piramidale cellen c (PC-c)". Ik zou graag willen dat op één regel alle van de leidende, koppelteken gescheiden stukken in een array terwijl ze worden verwijderd uit str . Aan het einde van deze regel zou ik een array moeten hebben die er als volgt uitziet:

['CA3 03223', 'DG 0101', 'CA2 0101', 'CA1 0101']

En str zou moeten zijn:

'pyramidal cells c (PC-c)'

Mijn huidige oplossing is:

myarray = []; match = ''
myarray << match.strip[0..-2] while (match = str.slice!(/[A-Z0-9]{2,3} \d{3,}[\-\s]/))

Nogal lelijk, ik weet het. Hoe kan ik dit inkorten tot een enkele redelijke lengte lijn? Ik zoek naar iets als String # scan dat de gevonden overeenkomsten verwijdert.

0
Mijn excuses voor het plaatsen van iets dat niet werkte. Ik heb het bewerkt om het te laten werken. Hoewel een lange en ingewikkelde coderegel niet bevorderlijk is voor de duidelijkheid, is het mogelijk dat er een duidelijke one-liner bestaat, en daarom stel ik deze vraag. Het idee dat ik zoek is eenvoudig genoeg - ik ben eigenlijk op zoek naar wat String # scan! zou zijn als het bestond.
toegevoegd de auteur Sean Mackesey, de bron
@CodeGnome Het streepje is hier geen goed scheidingsteken, ik weet het ... maar dit zijn de gegevens die ik heb, ik heb geen keus. Trailing words kunnen worden gescheiden van de toonaangevende substrings door de leidende substrings te matchen met de regex in mijn oplossing.
toegevoegd de auteur Sean Mackesey, de bron
Hoe ben je van plan de slepende woorden af ​​te bakenen van de rest van je string? Als u streepjes als scheidingsteken gebruikt, krijgt u CA1 0101 piramidale cellen c (PC-c) in uw array.
toegevoegd de auteur Todd A. Jacobs, de bron
Zou er geen vervangingsfunctie moeten zijn? U kunt de overeenkomst vervangen door een lege tekenreeks.
toegevoegd de auteur nhahtdh, de bron
Ik kan bevestigen dat de huidige "oplossing" mislukt op zowel 1.9.3 als 1.8.7. Verder moet ik vragen: wat is uw motivatie om dit op één lijn te doen? Dat lijkt niet bevorderlijk voor de duidelijkheid of onderhoudbaarheid ...
toegevoegd de auteur Darshan Rivka Whittle, de bron
Uw oplossing lijkt niet echt te werken. myarray blijft leeg en str is ongewijzigd (Ruby 1.9.3).
toegevoegd de auteur Andrew Marshall, de bron

1 antwoord

Iets als dit is waarschijnlijk het schoonste:

myarray, str = str.scan(re), str.gsub(re, '')

je kunt de regexp inline verplaatsen als je een one-liner wilt, maar dat zou ik niet doen

1
toegevoegd
Leuk. Schoner dan mijn oplossing, maar ik hoop op iets waar de regex niet twee keer hoeft te worden ingevoerd, dus kan deze inline zijn.
toegevoegd de auteur Sean Mackesey, de bron