Regulêre uitdrukking

duimnael|upright|Stephen Cole Kleene, een van die eerste vasleggers van die begrip.
duimnael|'n Swartlys op Wikipedia wat regulêre uitdrukkings gebruik om potensieel problematiese bladsytitels te identifiseer.

'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

Spesiale karakters

Die volgende is 'n lys van spesiale karakters. Indien vir 'n spesiale karakter getoets wil word moet dit voorafgegaan word met 'n \:

.  +  *  ?  ^  $  (  )  [  ]  {  }  |  \

Simbole

 Simbool 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, maar gaan nie begin van eerste lyn optel nie) $  Einde van 'n lyn (kan ook \n gebruik, maar gaan nie einde van die laaste lyn optel nie) . [^\n] Alles behalwe 'n nuwe lyn [\s\S] [.\n] Alles \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"). Dus, wanneer \w\W of \W\w.Kyk How does \b work when using regular expressions?

Kwantifiseerders
 {|
|-
| style="width:15px; vertical-align:top;" | ?
|Die vraagteken dui nul of een voorkomste van die voorafgaande element aan. Byvoorbeeld, colou?r pas beide "color" en "colour".
|-
| style="vertical-align:top;" | *
|Die asterisk dui nul of meer voorkomste van die voorafgaande element aan. Byvoorbeeld, ab*c pas "ac", "abc", "abbc", "abbbc", ensovoorts.
|-
| style="vertical-align:top;" | +
|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}
| Die voorafgaande element kom presies n keer voor.
|-
|{min,}
| Die voorafgaande element kom min of meer keer voor.
|-
|{,maks}
| Die voorafgaande element kom nul tot maks keer voor.
|-
|{min,maks}
| Die voorafgaande element kom ten minste min keer voor, maar nie meer as maks keer nie.
|}

 OF (vertikale karakter, |) 

Die 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 

 Beskrywing Verduideliking Kode PraktykPositiewe vooruitkyk (lookahead)  Pas begin (xxx) indien dit eindig met yyy  xxx(?=yyy)  xxxyyy, xxxzzzNegatiewe vooruitkyk (lookahead)  Pas begin (xxx) indien dit nie eindig met yyy nie  xxx(?ǃyyy)  xxxyyy, xxxzzzPositiewe terugkyk (look behind)  Pas einde (xxx) indien dit begin met yyy  (?<=yyy)xxx  yyyxxx, zzzxxxNegatiewe terugkyk (look behind)  Pas einde (xxx) indien dit nie begin met yyy nie  (?<!yyy)xxx  yyyxxx, zzzxxx

 Voorbeelde 

 m?s 

Wanneer alle drieletter karakters gevind moet word wat begin met 'n m en eindig met 'n s, kan dit soos volg gedoen word:

 m.s, of
 m.{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 

Wanneer die middelste karakter 'n vokaal moet wees kan dit soos volg gedoen word:

 m[aeiou]s

 vuur, voor 

Soos 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.

 Bybelverwysings 

Uitdrukking: \b(Gen|Eks|Lev|Num|Deu) +\d+[:\d,\-]*
 "(Gen|Eks|Lev|Num|Deu)" = "Gen" of "Eks" of "Lev" of "Num" of "Deu"
 " +" = Ten minste een spasie
 "\d+" = Ten minste een syfer
 "[:\d,\-]*" = Enige aantal dubbelpunte (":"), syfers ("\d"), kommas (",") of koppeltekens ("\-")Teks: aaa Gen 3 bbb Eks 10:11-12 ccc Lev 14:16,20 ddd

 abcxx, abcyy 

Teks:  abc, abcww, abcxx, abcyy, abczz  abc, abcww, abcxx, abcyy, abczzWat om te kry:  abcxx & abcyy  Indien abc ingesluit moet word.Uitdrukking:  abc(xx|yy)  abc(xx|yy)?

 Begin en einde van 'n lyn (^ en $) 

Teks: aaaa123456 123456bbbbWat om te kry: Van die begin van die lyn tot by die karakter '3' Van die karakter '4' tot by die einde van die lynUitdrukking: ^.*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 
(Engels = greedy and lazy quantifiersGreedy and lazy quantifiers)

 Lui GulsigTeks: <abc> 123 <def> 456 <ghi> 789 <abc> 123 <def> 456 <ghi> 789Wat om te kry: Alles binne "<" en ">" Vanaf eerste "<" tot laaste ">"Uitdrukking: <.*?>
 .* = Enige karakter, enige aantal
 ? = Stop voor eerste ">" <.*>

 Moenie woorde pas wat met spesifieke woorde begin nieKyk Regex - Find all matching words that don't begin with a specific prefix 

Teks:  A boyfriend and girlfriend gained a friend when they asked to befriend themWat om te kry:  Alle friend wat nie girl aan die voorkant het nie.Uitdrukking:  \b(?!girl)\w*friend\b
 \b = woordgrens = waar 'n \w langs 'n \W is (om omgekeerd) waar \w = [a-zA-Z0-9_]
 (?!girl) = enigiets behalwe girl
 \w* = Enige woordkarakter (dit sal alles insluit behalwe girl)
 friend = die woord friend
 \b = woordgrens

 Moenie woorde pas wat met spesifieke woorde eindig nie (lêertipes) 

Teks: Leername: leer1.doc, leer2.tmp, leer3.xlsx, leer4.1a3 Leername: leer1.doc, leer2.tmp, leer3.xlsx, leer4.1a3Wat om te kry: Alle lêertipes met agtervoegsels .tmp en waarvan die eerste en derde karakter 'n syfer is Die teenoorsteldeUitdrukking: \w+\.(tmp|\d\D\d)\w*
 \w+ = ten minste een woordkarakter (lêernaam)
 \. = 'n punt. Omdat 'n punt 'n spesiale karakter is, moet dit vooraf gegaan word met "\"
 (tmp|\d\D\d) = agtervoegsel = "tmp" of byvoorbeeld "1c3" \w+\.(?!tmp|\d\D\d)\w*

 Positiewe vooruitkyk: pas begin indien dit eindig met ... 

(Engels = Positive lookahead (?=)Regex Lookahead)

Teks: USD 100,  USD 350,  USD 12,345,  USD geldeenheid,  USD van AmerikaWat om te kry:Alle USD wat eindig met getalle (350, 12,345)Uitdrukking:USD(?=\s\d+?,?\d+)
 ?= : Eindig met
 \s : Witspasie na USD. \s = [ \n\r\t\f]
 \d+? : Ten minste een getal. Die vraagteken dui aan dat gestop moet word tot die eerste karakter wat nie 'n getal is nie.
 ,? : Een of meer komma
 \d+ : Nog getalle

 Negatiewe vooruitkyk: pas begin indien dit nie eindig met ... 
(Engels = Negative lookahead (?ǃ)Regex Lookahead)

Teks:  kar verkoop,   kar nie verkoop,  kar verkoop,  kar herstelWat om te kry:  Alle kar wat NIE eindig met verkoopUitdrukking:  kar(?!\s+verkoop)
 ?! : Nie eindig met ('n "!" dui gewoonlik die negatief aan. Byvoorbeeld, die Pythonkode if a != b beteken "as a ongelyk is aan b")
 \s+ : Witspasie na kar. \s = [ \n\r\t\f]

 Positiewe terugkyk: pas einde indien dit begin met ... 
(Engels = Positive look behind (?<=))

Teks:  abc123,  abc567, def123Wat om te kry:  Alle 123 wat voorafgegaan word deur abcUitdrukking:  (?<=[a-c]{3})[1-3]{3}

 Passing tussen spesifieke letters 
(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 ... 
(Engels = Negative look behind (?<!))

Teks:  abc123,  abc567, def123Wat om te kry:  Alle 123 wat nie voorafgegaan word deur abc nieUitdrukking:  (?<![a-c]{3})[1-3]{3}

 Syfers geskei deur 'n duisendskeier 

Teks:  aaa 123.45 bbb 67 890.12 ccc 345 67 890.12 dddWat om te kry:  Alle syfers in die formaat # ###.##Uitdrukking:  \b\d{1,3}(?:\s\d{3})*(?:\.\d{2})?\b
 \b\d{1,3} : 'n Getal wat uit 1 tot 3 syfers bestaan
 (?:\s\d{3})* : Groepe van drie getalle wat vooraf gegaan word deur 'n spasie (die duisendskeier). ?: kan ook weggelaat word. \s kan ook vervang word met " ".
 (?:\.\d{2})? : 'n Desimale punt opgevolg deur twee syfers. Die ? na die ) beteken dit is opsioneel. Met ander woorde, sluit dit in indien dit daar is". ?: kan ook weggelaat word.
 \b : Woordgrens = waar 'n \w langs 'n \W is (om omgekeerd) waar \w = [a-zA-Z0-9_]

 Toets regulêre uitdrukkings 

Regulêre uitdrukkings kan getoets word op die internet:

 regex101.com

Of gratis programme soos:

 Visual Studio Code
 Notepad++

 Bronnelys 
 Regular Expressions (Regex) Tutorial: How to Match Any Pattern of Text (Corey Schafer, 5 Okt 2017, Youtube)
 Python Tutorial: re Module - How to Write and Match Regular Expressions (Regex) (Corey Schafer, 24 Okt 2017, Youtube)

 Verwysings 

Kategorie:Rekenaarwetenskap