Regulêre uitdrukking
'n Regulêre uitdrukking is 'n reeks karakters wat 'n soekpatroon definieer. Sulke patrone word gewoonlik deur stringsoekalgoritmes in vind- of vind-en-vervang-operasies op stringe, of vir invoervalidering aangewend. Dit is 'n onderwerp wat in teoretiese rekenaarwetenskap en formeletaalteorie bestudeer word.
Die konsep ontstaan in die 1950's toe die Amerikaanse wiskundige Stephen Cole Kleene die beskrywing van 'n regulêre taal formaliseer. Die konsep kom met die aanvang van teksverwerkernutsgoed in Unix in algemene gebruik. Verskillende sintaksisse vir die skryf van regulêre uitdrukkings bestaan sedert die 1980's, waaronder die POSIX-standaard en die Perl-sintaksis.
Regulêre uitdrukkings word in soekenjins, vind-en-vervang-operasies in woordverwerkers en teksredigeerders, teksverwerkernutsgoed soos sed en AWK, en leksikale analise gebruik.
Baie programmeertale verskaf regulêre-uitdrukkingvermoë ingebou of deur middel van biblioteke.
Basiese konsepte
wysigSpesiale karakters
wysigDie volgende is 'n lys van spesiale karakters. Indien vir 'n spesiale karakter getoets wil word moet dit voorafgegaan word met 'n \
:
. + * ? ^ $ ( ) [ ] { } | \
Simbole
wysigSimbool | Alternatief | Beskrywing |
---|---|---|
\n
|
|
Lynbreek |
\r
|
|
Lynbreek |
\t
|
|
(Engels = Tab) |
\f
|
|
(Engels = form feed) |
\s
|
[ \n\r\t\f]
|
Witspasie (let op die spasie voor "\n") |
\S
|
[^ \n\r\t\f]
|
Alles behalwe 'n witspasie |
^
|
|
Begin van 'n nuwe lyn (kan ook \n gebruik)
|
$
|
|
Einde van 'n lyn (kan ook \n gebruik)
|
.
|
[^\n]
|
Alles behalwe 'n nuwe lyn |
w
|
[a-zA-Z0-9_]
|
Woordkarakters |
\W
|
[^a-zA-Z0-9_]
|
Alles behalwe woordkarakters |
\d
|
[0-9]
|
Numeriese waardes |
\D
|
[^0-9]
|
Alles behalwe numeriese waardes |
\b
|
[\s\t]
|
Woordgrens (Engels = "word boundary") |
Kwantifiseerders
wysig?
Die vraagteken dui nul of een voorkomste van die voorafgaande element aan. Byvoorbeeld, colou?r
pas beide "color" en "colour".*
Die asterisk dui nul of meer voorkomste van die voorafgaande element aan. Byvoorbeeld, ab*c
pas "ac", "abc", "abbc", "abbbc", ensovoorts.+
Die plusteken dui een of meer voorkomste van die voorafgaande element aan. Byvoorbeeld, ab+c
pas "abc", "abbc", "abbbc", ensovoots, maar NIE "ac" nie.{n}
[1]Die voorafgaande element kom presies n keer voor. {min,}
[1]Die voorafgaande element kom min of meer keer voor. {,maks}
[1]Die voorafgaande element kom nul tot maks keer voor. {min,maks}
[1]Die voorafgaande element kom ten minste min keer voor, maar nie meer as maks keer nie.
OF (vertikale karakter, |)
wysigDie vertikale lyn of pypkarakter kan gebruik om 'n kombinasie van woorde te spesifiseer.
v(uu|oo)r
kan gebruik word om vuur en voor te vind. Dit sal ander woorde soos vier, voer, vir, ensovoorts uitsluit.
Positiewe en negatiewe vooruitkyk en terugkyk
wysigBeskrywing | Verduideliking | Kode | Praktyk |
---|---|---|---|
Positiewe vooruitkyk (lookahead) | Pas begin (xxx) indien dit eindig met yyy | xxx(?=yyy) |
xxxyyy, xxxzzz |
Negatiewe vooruitkyk (lookahead) | Pas begin (xxx) indien dit nie eindig met yyy nie | xxx(?ǃyyy) |
xxxyyy, xxxzzz |
Positiewe terugkyk (look behind) | Pas einde (xxx) indien dit begin met yyy | (?<=yyy)xxx |
yyyxxx, zzzxxx |
Negatiewe terugkyk (look behind) | Pas einde (xxx) indien dit nie begin met yyy nie | (?<!yyy)xxx |
yyyxxx, zzzxxx |
Voorbeelde
wysigm?s
wysigWanneer alle drieletter karakters gevind moet word wat begin met 'n m en eindig met 'n s, kan dit soos volg gedoen word:
m.s
, ofm.{1}s
Let wel dat m.*s
ook woorde gaan insluit soos maas, mees, mens, ensovoorts
En m.?s
gaan ook ms insluit.
mas, mes, mis, mos, mus
wysigWanneer die middelste karakter 'n vokaal moet wees kan dit soos volg gedoen word:
m[aeiou]s
vuur, voor
wysigSoos reeds genoem word die vertikale streep gebruik om 'n opsie van verskillende meervoudige karakters te gee.
v(uu|oo)r
kan gebruik word om vuur en voor te vind.
Soek Bybelverwysings in teks
wysigUitdrukking: | (Gen|Eks|Lev|Num|Deu) +\d+[:\d,\-]* " +" = Ten minste een spasie "\d+" = Ten minste een syfer "[:\d,\-]*" = Enige aantal syfers, kommas of koppeltekens |
Teks: | aaa Gen 3 bbb Eks 10:11-12 ccc Lev 14:16,20 ddd |
abcxx, abcyy
wysigTeks: | abc, abcww, abcxx, abcyy, abczz | abc, abcww, abcxx, abcyy, abczz |
Wat om te kry: | abcxx & abcyy | Indien abc ingesluit moet word. |
Uitdrukking: | abc(xx|yy) |
abc(xx|yy)?
|
Begin en einde van 'n lyn (^ en $)
wysigTeks: | aaaa 123456 |
123456 bbbb |
Wat om te kry: | Van die begin van die lyn tot by die karakter '3' | Van die karakter '4' tot by die einde van die lyn |
Uitdrukking: | ^.*3
|
4.*$
|
\n
kan ook gebruik word om die begin of einde van 'n lyn aan te dui.
Indien \n
in plaas van ^
gebruik word, gaan die eerste lyn van die teks nie in ag geneem word nie.
Indien \n
in plaas van $
gebruik word, gaan die laaste lyn van die teks nie in ag geneem word nie.
Om hierdie probleem te oorkom kan 'n mens bloot \n
aan die voorkant en die agterkant van die teks byvoeg voor daar gesoek word.
Lui en gulsige kwantifiseerders
wysig(Engels = greedy and lazy quantifiers[2])
Lui | Gulsig | |
Teks: | <abc> 123 <def> 456 <ghi> 789 | <abc> 123 <def> 456 <ghi> 789 |
Wat om te kry: | Alles binne "<" en ">" | Vanaf eerste "<" tot laaste ">" |
Uitdrukking: | <(.*?)>
|
<.*?>
|
Moenie woorde pas wat met spesifieke woorde begin nie
wysigTeks: | A boyfriend and girlfriend gained a friend when they asked to befriend them |
Wat om te kry: | Alle friend wat nie girl aan die voorkant het nie. |
Uitdrukking: | \b(?!girl)\w*friend\b
|
Moenie woorde pas wat met spesifieke woorde eindig nie (lêertipes)
wysigTeks: | Leername: leer1.doc, leer2.tmp, leer3.xlsx, leer4.1a3 | Leername: leer1.doc, leer2.tmp, leer3.xlsx, leer4.1a3 |
Wat om te kry: | Alle lêertipes met agtervoegsels .tmp en waarvan die eerste en derde karakter 'n syfer is | Die teenoorstelde |
Uitdrukking: | \w+\.(tmp|\d\D\d)\w*
|
\w+\.(?!tmp|\d\D\d)\w*
|
Positiewe vooruitkyk: pas begin indien dit eindig met ...
wysig(Engels = Positive lookahead (?=)[3])
Teks: | USD 100, USD 350, USD 12,345, USD geldeenheid, USD van Amerika |
Wat om te kry: | Alle USD wat eindig met getalle (350, 12,345) |
Uitdrukking: | USD(?=\s\d+?,?\d+)
|
Negatiewe vooruitkyk: pas begin indien dit nie eindig met ...
wysig(Engels = Negative lookahead (?ǃ)[4])
Teks: | kar verkoop, kar nie verkoop, kar verkoop, kar herstel |
Wat om te kry: | Alle kar wat NIE eindig met verkoop |
Uitdrukking: | kar(?!\s+verkoop)
|
Positiewe terugkyk: pas einde indien dit begin met ...
wysig(Engels = Positive look behind (?<=))
Teks: | abc123, abc567, def123 |
Wat om te kry: | Alle 123 wat voorafgegaan word deur abc |
Uitdrukking: | (?<=[a-c]{3})[1-3]{3}
|
Passing tussen spesifieke letters
wysig(Positive look behind (?<=) gekombineer met Positive look ahead (?=))
Teks: | #123#456#789# |
Wat om te kry: | Alle tussen woorde tussen "3" en "#" |
Uitdrukking: | (?<=#).*?(?=#)
|
Teenoor:
Uitdrukking: | #.*?#
|
Teks: | #123#456#789# |
Negatiewe terugkyk: pas einde indien dit NIE begin met ...
wysig(Engels = Negative look behind (?<!))
Teks: | abc123, abc567, def123 |
Wat om te kry: | Alle 123 wat nie voorafgegaan word deur abc nie |
Uitdrukking: | (?<![a-c]{3})[1-3]{3}
|
Syfers geskei deur 'n duisendskeier
wysigTeks: | aaa 123.45 bbb 67 890.12 ccc 345 67 890.12 ddd |
Wat om te kry: | Alle syfers in die formaat # ###.## |
Uitdrukking: | \b\d{1,3}(?: \d{3})*(?:\.\d{2})?\b
|
Bronnelys
wysigVerwysings
wysig- ↑ 1,0 1,1 1,2 1,3 Kerrisk, Michael. "grep(1) - Linux manual page". man7.org. Besoek op 31 Januarie 2023.
- ↑ Greedy and lazy quantifiers
- ↑ Regex Lookahead
- ↑ Regex Lookahead