Regulêre uitdrukking

volgorde van karakters wat 'n soekpatroon vorm
(Aangestuur vanaf Reëlmatige 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 pasresultate vir die patroon
(?<=\.) {2,}(?=[A-Z])
Ten minste twee spasies word gepas, maar slegs indien hulle reg na 'n punt (.) en voor 'n hoofletter verskyn.
Stephen Cole Kleene, een van die eerste vasleggers van die begrip.
'n Swartlys op Wikipedia wat regulêre uitdrukkings gebruik om potensieel problematiese bladsytitels te identifiseer.

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

wysig

Spesiale karakters

wysig

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

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

Simbole

wysig
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)
$ 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, |)

wysig

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

wysig
Beskrywing 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

wysig

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

wysig

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

m[aeiou]s

vuur, voor

wysig

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.

Soek Bybelverwysings in teks

wysig
Uitdrukking: (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

wysig
Teks: 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 $)

wysig
Teks: 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: <(.*?)>
  • () = Die hakie isoleer die teks binne die pylhakies
  • .* = Enige karakter, enige aantal
  • ? = Stop voor eerste ">"
<.*?>

Moenie woorde pas wat met spesifieke woorde begin nie

wysig
Teks: 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
  • \b = woordgrens = enige witspasie
  • (?!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)

wysig
Teks: 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+ = 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 ...

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+)
  • ?= : Eindig met
  • \s : Witspasie na USD
  • \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 ...

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)
  • ?! : 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

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

wysig
Teks: 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
  • \b\d{1,3}  : 'n Getal wat uit 1 tot 3 syfers bestaan
  • (?: \d{3})* : Groepe van drie getalle wat vooraf gegaan word deur 'n spasie (die duisendskeier). "?:" kan ook weggelaat word.
  • (?:\.\d{2})? : 'n Desimale punt opgevolg deur twee syfers. Die "?" beteken dit is opsioneel. Met ander woorde, sluit dit in indien dit daar is". "?:" kan ook weggelaat word.
  • \b : Woordgrens

Bronnelys

wysig

Verwysings

wysig
  1. 1,0 1,1 1,2 1,3 Kerrisk, Michael. "grep(1) - Linux manual page". man7.org. Besoek op 31 Januarie 2023.
  2. Greedy and lazy quantifiers
  3. Regex Lookahead
  4. Regex Lookahead