23 april 2018

CO2 etc. GREP anno 2018: met een nieuwe Positive Lookbehind!

.
In mijn boek en ook op dit blog heb je kunnen lezen hoe je met behulp van een GREP-stijl snel de 2 achter CO2 en NO2 en tussen H2O subscript kunt zetten.
Daarnaast kun je snel acroniemen in kleinkapitaal zetten met een GREP-stijl.

Probleem was een tekst waar ook acroniemen met een - en _ voorkwamen alsmede iets als PDF12 en PNG01.



Als we de GREP voor acroniemen uitbreiden naar cijfers in de naam hebben we het probleem dat ook CO en NO etc. kleinkapitaal gezet gaan worden.

Ik moest dus een uitzondering maken voor CO, HO, NO, deze moesten worden 'rechtgezet' naar gewone kapitalen.

Daarnaast was de uitdaging om zoveel mogelijk in één uitdrukking te zetten, dus NO2, CO2 en H2O in één definitie.

Met hulp van de Facebook GREP-groep kwam ik uit op:

Voor acroniemen:

\<\u[\u_\d-]+\>

Voor subscript zetten van de 2 in CO2, NO2 en H2O:

(?<=[CN]O)2|(?<=H)2(?=O)

Voor corrigeren naar kapitaal van CO, NO en H2O:

[CN]O2|H2O

Tenslotte ook voor vierkante meter nog eentje:

(?<=m)2





Maar...


Er bestaat sinds een aantal CC versies nu ook een andere vorm voor de Positive Lookbehind (?<=) namelijk de simpelere \K.
De \K moet echter achter de uitdrukking komen!

Zo kunnen we nu de NO2, H2O en CO2 nog verder versimpelen naar:

([CN]O)\K2|(H)\K2(?=O)

Oftwel:
Of CO of NO:
[CN]O
Kijk achter naar een 2:
\K2
of (het teken | ) een H gevolgd door een O, kijk achter de H voor de 2:
|(H)\K2(?=O)

Dat kan ook bij vierkante meter:
de m moet los staan, dus een begin en eind van woord, en dan gevolgd door een 2:

\bm\K2\b

 \b betekent Woordgrens en is een 'variant van begin/eind woord \< en \>

Overigens:

De haakjes zijn vaak handig om de GREP te kunnen lezen 'in stukjes', maar ze zijn niet echt altijd nodig. We kunnen dus ook rustig schrijven:

[CN]O\K2|H\K2(?=O)

Ook kun je hier een woordgrens toevoegen (net iets netter wellicht)

 \b[CN]O\K2\b|\bH\K2(?=O\b)

Ook kun je hier een woordgrens toevoegen (net iets netter:)

\b\u\u+\b





Die \K is er vanaf versie CC 2014.

Niet alleen is \K simpeler, het blijkt ook sneller. Bovendien maakt het kortere GREP's mogelijk, vergelijk maar eens:

((?<=map)|(?<=figure)|(?<=table))\s\d+


of: 

(map|figure|table)\s\K\d+ 






Geen opmerkingen: