&Anders.Lund; &Anders.Lund.mail;
Oliver
Kellogg

    okellogg@users.sf.net

Translation

# Regulaj Esprimoj

    Ĉi tiu Apendico enhavas mallongan sed espereble sufiĉan kaj
    kovrantan enkondukon al la mondo de regulaj
    esprimoj. Ĝi dokumentas regulajn esprimojn en la formo
    havebla ene de &kappname;, kiu ne kongruas kun la regulaj
    esprimoj de perl, nek kun tiuj de ekzemple
    grep.

## Enkonduko

Regulaj Esprimoj provizas al ni manieron priskribi iujn eblajn enhavojn de teksta ĉeno en maniero komprenita de malgranda programaro, por ke ĝi povu esplori ĉu teksto kongruas, kaj ankaŭ en la kazo de altnivelaj aplikoj kun la rimedoj por konservi pecojn aŭ la kongruan tekston.

Ekzemplo: Diru, ke vi volas serĉi tekston por alineoj, kiuj komenciĝas per iu el la nomoj Henrik aŭ Pernille sekvata de iu formo de la verbo diri.

Kun normala serĉo, vi komencus serĉi la antaŭnomon, Henrik eble sekvata de dir tiel: `Henrik dir`, kaj dum serĉado por kongruoj, vi devus forĵeti tiujn, kiuj ne estas la komenco de alineo, same kiel tiujn, en kiuj la vorto komencanta per la literoj dir ne estis aŭ diras, diris aŭ tiel. Kaj poste kompreneble ripetu ĉion tion kun la sekva nomo...

Kun Regulaj Esprimoj, tiu tasko povus esti plenumita per ununura serĉo, kaj kun pli granda grado da precizeco.

Por atingi ĉi tion, Regulaj Esprimoj difinas regulojn por esprimi en detaloj ĝeneraligo de ĉeno kongrua. Nia ekzemplo, kiun ni laŭvorte esprimus tiel: Linio komencanta per aŭ Henrik aŭ Pernille (eble sekvante ĝis 4 malplenajn aŭ tabulajn signojn) sekvata de Blanka spaco sekvata de dir kaj tiam aŭ as aŭ is povus esti esprimita per la sekva regula esprimo:

`^[ \t]{0,4}(Henrik|Pernille) dir(as|is)`

La supra ekzemplo montras ĉiujn kvar ĉefajn konceptojn de modernaj Regulaj Esprimoj, nome:

- Ŝablonoj

- Asertoj

- Kvantigiloj

- Retroreferencoj

La kamero (`^`) komencanta la esprimon estas aserto, estante vera nur se la sekva kongrua ĉeno estas ĉe la komenco de linio.

La ĉenoj `[ \t]` kaj `(Henrik|Pernille) dir(as|is)` estas ŝablonoj. La unua estas signa klaso kiu kongruas aŭ kun malplena aŭ (horizontala) tabula signo; la alia ŝablono enhavas unue subŝablon kongruantan aŭ `Henrik` aŭ `Pernille`, poste pecon kongruantan kun la ĝusta ĉeno `dir` kaj fine subŝablono kongruanta aŭ `as` aŭ `is`

La ĉeno `{0,4}` estas kvantigilo diranta ie ajn de 0 ĝis 4 el la antaŭa.

Ĉar regulesprima programaro subtenanta la koncepton de retroreferencoj ŝparas la tutan kongruan parton de la ĉeno kaj ankaŭ sub-ŝablonojn enfermitajn inter krampoj, donitaj iujn rimedojn por aliro al tiuj referencoj, ni povus meti niajn manojn aŭ al la tuta kongruo (serĉante tekstdokumenton en redaktilo kun regula esprimo, kiu estas ofte markita kiel elektita) aŭ aŭ la trovita nomo, aŭ al la lasta parto de la verbo.

Tute kune, la esprimo kongruos kie ni volis ĝin, kaj nur tie.

La sekvaj sekcioj priskribos detale kiel konstrui kaj uzi ŝablonojn, signojn klasojn, asertojn, kvantigilojn kaj retroreferencojn, kaj la fina sekcio donos kelkajn utilajn ekzemplojn.

## Ŝablonoj

Ŝablonoj konsistas el laŭvortaj ĉenoj kaj signoklasoj. Ŝablonoj povas enhavi sub-ŝablonojn, kiuj estas ŝablonoj enfermitaj en krampoj.

### Eskapantaj signoj

En ŝablonoj same kiel en signo klasoj, kelkaj signoj havas specialan signifon. Por laŭvorte kongrui kun iu ajn el tiuj signoj, ili devas esti markitaj aŭ eskapitaj por sciigi al la regula esprimo programaro ke ĝi devus interpreti tiajn signojn en sia laŭvorta signifo.

Ĉi tio estas farita antaŭmetante la signon per malantaŭa oblikvo (`\`).

La regula esprimo programaro silente ignoros eskapi signon kiu ne havas specialan signifon en la kunteksto, do eskapi ekzemple j (`\j`) estas sekura. Se vi dubas, ĉu signo povus havi specialan signifon, vi do povas eviti ĝin sekure.

Eskapo kompreneble inkluzivas la inversan oblikvan signon mem, por laŭvorte kongrui kun tia, vi skribus `\\`.

### Signaj klasoj kaj mallongigoj

signa klaso estas esprimo kiu kongruas kun unu el difinita aro de signoj. En Regulaj esprimoj, signoklasoj estas difinitaj metante la laŭleĝajn signojn por la klaso en kvadrataj krampoj, `[]`, aŭ uzante unu el la mallongigitaj klasoj priskribitaj malsupre.

Simplaj signoklasoj enhavas nur unu aŭ plurajn laŭvortajn signojn, ekzemple `[abc]` (kongruas kun ĉiu el la literoj a, b aŭ c) aŭ `[0123456789]` (kongruante kun iu ajn cifero).

Ĉar literoj kaj ciferoj havas logikan ordon, vi povas mallongigi tiujn specifante intervalojn de ili: `[a-c]` estas egala al `[abc]` kaj `[0-9 ]` estas egala al `[0123456789]`. Kombini ĉi tiujn konstrukciojn, ekzemple `[a-fynot1-38]` estas tute laŭleĝa (la lasta kongruus, kompreneble, ĉu de a,b,c,d,e,f, y,n,o,t, 1,2,3 aŭ 8).

Ĉar majuskloj estas malsamaj signoj de siaj ne-majusklaj ekvivalentoj, por krei senmajusklan signoklason kongruan kun a aŭ b, ĉiukaze vi devas skribi ĝin `[aAbB]`.

Kompreneble eblas krei negativan klasan kongruon kiel io ajn krom Por fari tion metu signon (`^`) ĉe la komenco de la klaso :

`[^abc]` kongruos kun ajna signo sed a, b aŭ c.

Krom laŭvortaj signoj, kelkaj mallongigoj estas difinitaj, farante la vivon ankoraŭ iom pli facila:

`\a`

  Ĉi tio kongruas kun la &ASCII; sonorilsigno (BEL, 0x07).

`\f`

  Ĉi tio kongruas kun la &ASCII; formo-flua signo (FF, 0x0C).

`\n`

  Ĉi tio kongruas kun la &ASCII; signo de linio (LF, 0x0A, Unix-novlinio).

`\r`

  Ĉi tio kongruas kun la &ASCII; kaleŝorevena signo (CR, 0x0D).

`\t`

  Ĉi tio kongruas kun la &ASCII; horizontala klapeta signo (HT, 0x09).

`\v`

  Ĉi tio kongruas kun la &ASCII; vertikala klapeta signo (VT, 0x0B).

`\xhhhh`

  Ĉi tio kongruas kun la Unikoda signo responda al la deksesuma nombro hhhh (inter 0x0000 kaj 0xFFFF). \0ooo (&ie;, \zero ooo) kongruas kun la signo &ASCII;/Latin-1 responda al la okta nombro ooo (inter 0 kaj 0377).

`.` (punkto)

  Ĉi tio kongruas kun ajna signo (inkluzive de novlinio).

`\d`

  Ĉi tio kongruas kun cifero. Egala al `[0-9]`

`\D`

  Ĉi tio kongruas kun necifero. Egala al `[^0-9]` aŭ `[^\d]`

`\s`

  Ĉi tio kongruas kun blankspaco. Praktike egala al `[ \t\n\r]`

`\S`

  Ĉi tio kongruas kun neblankspaco. Praktike egala al `[^ \t\r\n]`, kaj egala al `[^\s]`

`\w`

  Kongruas kun ajna vorta signo - ĉi-kaze ajna litero, cifero aŭ substreko. Egala al `[a-zA-Z0-9_]`

`\W`

  Kongruas kun ajna nevorta signo - io ajn krom literoj, ciferoj aŭ substreko. Egala al `[^a-zA-Z0-9_]` aŭ `[^\w]`

La POSIX-notacio de klasoj, `[:<class name>:]` ankaŭ estas subtenataj. Ekzemple, `[:cifero:]` estas ekvivalenta al `\d`, kaj `[:space:]` al `\s`. Vidu la plenan liston de POSIX signoklasoj ĉi tie.

La mallongigitaj klasoj povas esti enmetitaj ene de propra klaso, ekzemple por kongrui kun vorta signo, spaceto aŭ punkto, vi povus skribi `[\w \.]`

#### Signoj kun specialaj signifoj ene de signoklasoj

La sekvaj signoj havas specialan signifon ene de la signo klaskonstruaĵo [], kaj devas esti eskapitaj por esti laŭvorte inkluditaj en klaso:

`]`

  Finas la signoklason. Devas esti eskapata krom se ĝi estas la unua signo en la klaso (povas sekvi neeskapitan signon).

`^` (marko)

  Indikas negativan klason, se ĝi estas la unua signo. Devas esti eskapata por kongrui laŭvorte se ĝi estas la unua signo en la klaso.

`-` (streketo)

  Indikas logikan intervalon. Devas ĉiam esti eskapata ene de signoklaso.

`\` (malantaŭa oblikvo)

  La eskapa signo. Oni devas ĉiam eskapi.

### Alternativoj: kongrui unu el

Se vi volas kongrui kun unu el aro de alternativaj ŝablonoj, vi povas apartigi tiujn per `|` (vertikala streketo).

Ekzemple por trovi aŭ Johano aŭ Harry vi uzus esprimon `Johano|Harry`.

### Subŝablonoj

Subŝablonoj estas ŝablonoj enfermitaj en krampoj, kaj ili havas plurajn uzojn en la mondo de regulaj esprimoj.

#### Specifante alternativojn

Vi povas uzi subŝablon por grupigi aron da alternativoj en pli granda ŝablono. La alternativoj estas apartigitaj per la signo | (vertikala stango).

Ekzemple por kongrui kun iu ajn el la vortoj int, float aŭ double, vi povus uzi la ŝablonon `int|float|double`. Se vi volas trovi nur unu se ĝi estas sekvata de iom da blankspaco kaj poste kelkaj literoj, metu la alternativojn ene de subŝablono: `(int|float|double)\s+\w+`.

#### Kaptante kongruan tekston (retroreferencoj)

Se vi volas uzi retroreferencon, uzu subŝablonon `(PATTERN)` por ke la dezirata parto de la ŝablono memoru. Por eviti ke la subŝablono estu memorita, uzu ne-kaptan grupon `(?:PATTERN)`.

Ekzemple, se vi volas trovi du aperon de la sama vorto apartigitaj per komo kaj eble iom da blankspaco, vi povus skribi `(\w+),\s*\1`. La subŝablono `\w+` trovus pecon da vortsignoj, kaj la tuta esprimo kongruus se tiuj estus sekvataj de komo, 0 aŭ pli da blankspaco kaj tiam egala parto de vortsignoj. (La ĉeno `\1` referencas al la unua subŝablono enfermita inter krampoj.)

Por eviti ambiguaĵojn kun uzado de `\1` kun kelkaj ciferoj malantaŭ ĝi (&eg; `\12` povas esti 12-a subŝablono aŭ nur la unua subŝablono kun `2`) ni uzas `\{12}` kiel sintakson por plurciferaj subŝablonoj.

Ekzemploj:

- `\{12}1` estas uzu subŝablon 12

- `\123` estas uzi kapton 1 tiam 23 kiel la normalan tekston

#### Lookahead-Asertoj

Antaŭrigarda aserto estas subŝablono, komencanta aŭ `?=` aŭ `?!`.

Ekzemple por kongrui kun la laŭvorta ĉeno Bill sed nur se ne sekvata de Gates, vi povus uzi ĉi tiun esprimon: `Bill(?! Gates)`. (Ĉi tio trovus Bill Clinton same kiel Billy the kid, sed silente ignorus la aliajn kongruojn.)

Subaj ŝablonoj uzataj por asertoj ne estas kaptitaj.

Vidu ankaŭ Asertoj.

#### Lookbehind Asertoj

Malantaŭa aserto estas subŝablono, komencante aŭ `?<=` aŭ `?<!`.

Rigardu malantaŭen havas la saman efikon kiel la rigardo antaŭen, sed funkcias malantaŭen. Ekzemple por kongrui kun la laŭvorta ĉeno fruit sed nur se ne antaŭita de grape, vi povus uzi ĉi tiun esprimon: `(?<!grape)fruit`.

Subaj ŝablonoj uzataj por asertoj ne estas kaptitaj.

Vidu ankaŭ Asertoj

### Signoj kun speciala signifo ene de ŝablonoj

La sekvaj signoj havas signifon ene de ŝablono, kaj devas esti eskapitaj se vi volas laŭvorte kongrui kun ili:

`\` (malantaŭa oblikvo)

  La eskapa signo.

`^` (marko)

  Asertas la komencon de la ĉeno.

`$`

  Asertas la finon de ĉeno.

`()` (maldekstra kaj dekstra krampoj)

  Indikas subajn ŝablonojn.

`{}` (maldekstre kaj dekstraj buklaj krampoj)

  Indikas nombrajn kvantorojn.

`[]` (maldekstre kaj dekstraj kvadrataj krampoj)

  Indikas signoklasojn.

`|` (vertikala stango)

  logika AŬ. Apartigas alternativojn.

`+` (plus-signo)

  Kvantigilo, 1 aŭ pli.

`*` (asterisko)

  Kvantigilo, 0 aŭ pli.

`?` (demandosigno)

  Nedeviga signo. Povas esti interpretita kiel kvantigilo, 0 aŭ 1.

## Kvantigiloj

Kvantigiloj permesas al regula esprimo kongrui kun difinita nombro aŭ gamo de nombroj de aŭ signo, signoklaso aŭ subŝablono.

Kvantigiloj estas enfermitaj en krampoj (`{` kaj `}`) kaj havas la ĝeneralan formon `{[minimum-okazoj][,[maksimum-okazoj]]}`

La uzado estas plej bone klarigita per ekzemplo:

`{1}`

  Ĝuste 1 okazo

`{0,1}`

  Nulo aŭ 1 okazoj

`{,1}`

  La sama, kun malpli da laboro ;)

`{5,10}`

  Almenaŭ 5 sed maksimume 10 okazoj.

`{5,}`

  Almenaŭ 5 okazoj, neniu maksimumo.

Aldone, estas kelkaj mallongigoj:

`*` (asterisko)

  simile al `{0,}`, trovi ajnan nombron da aperoj.

`+` (plus-signo)

  simila al `{1,}`, almenaŭ 1 okazo.

`?` (demandosigno)

  simila al `{0,1}`, nulo aŭ 1 okazo.

### Avideco

Kiam oni uzas kvantigilojn sen maksimumo, regulaj esprimoj defaŭlte kongruas kiel eble plej multe de la serĉata ĉeno, ofte konata kiel avida konduto.

Moderna regula esprimo programaro disponigas la rimedojn por malŝalti avidecon, kvankam en grafika medio dependas de la interfaco provizi al vi aliron al ĉi tiu funkcio. Ekzemple serĉa dialogo provizanta serĉon de regula esprimo povus havi markobutonon etikeditan Minimuma kongruo same kiel ĝi devus indiki ĉu avideco estas la defaŭlta konduto.

### En kunteksto ekzemploj

Jen kelkaj ekzemploj de uzado de kvantigiloj:

`^\d{4,5}\s`

  Kongruas kun la ciferoj en 1234 go kaj 12345 nun, sed nek en 567 dekunu nek en 223459 ie.

`\s+`

  Kongruas kun unu aŭ pluraj blankspacsignoj.

`(bla){1,}`

  Kongruas ĉiujn blablabla kaj la bla en merlo aŭ tabla.

`/?>`

  Kongruas /> en <closeditem/> same kiel > en <penitem>.

## Asertoj

Asertoj permesas al regula esprimo kongrui nur sub certaj kontrolitaj kondiĉoj.

Aserto ne bezonas signon por egali, ĝi prefere esploras la ĉirkaŭon de ebla kongruo antaŭ agnoski ĝin. Ekzemple la aserto vortlimo ne provas trovi nevortan signon kontraŭ vorto unu ĉe ĝia pozicio, anstataŭe ĝi certigas, ke ne estas vorta signo. Tio signifas, ke la aserto povas kongrui kie ne estas signo, &ie; ĉe la finoj de serĉata ĉeno.

Iuj asertoj efektive ja havas ŝablonon por kongrui, sed la parto de la ĉena kongruo kiu ne estos parto de la rezulto de la kongruo de la plena esprimo.

Regulaj Esprimoj kiel dokumentite ĉi tie subtenas la sekvajn asertojn:

`^` (marko: komenco de ĉeno)

  Kongruas kun la komenco de la serĉita ĉeno.

  La esprimo `^Peter` kongruos ĉe Petro en la ĉeno Petro, he! sed ne en He, Petro!

`$` (fino de ĉeno)

  Kongruas kun la fino de la serĉita ĉeno.

  La esprimo `you\?$` kongruos ĉe la lasta vi en la ĉeno You didn't do that, did you? sed nenie en You didn't do that, right?

`\b` (vortlimo)

  Kongruas se estas vortsigno ĉe unu flanko kaj ne vortsigno ĉe la alia.

  Ĉi tio utilas por trovi vortfinaĵojn, ekzemple ambaŭ finaĵojn por trovi tutan vorton. La esprimo `\bin\b` kongruos ĉe la aparta in en la ĉeno He came in through the window, sed ne ĉe la in en window.

`\B` (ne vortlimo)

  Kongruas kie ajn \b ne faras.

  Tio signifas, ke ĝi kongruos ekzemple ene de vortoj: La esprimo `\Bin\B` kongruos en window sed ne en integer aŭ I'm in love.

`(?=PATTERN)` (Pozitiva antaŭrigardo)

  Antaŭrigarda aserto rigardas la parton de la ĉeno sekvanta ebla kongruo. La pozitiva antaŭrigardo malhelpos la ĉenon kongrui se la teksto sekvanta la ebla kongruo ne kongruas kun la PATTERN de la aserto, sed la teksto kongrua per tio ne estos inkluzivita en la rezulto.

  La esprimo `handy(?=\w)` kongruos ĉe handy en handyman sed ne en That came in handy!

`(?!PATTERN)` (Negativa antaŭrigardo)

  La negativa antaŭrigardo malhelpas ebla kongruo esti agnoskita se la sekva parto de la serĉita ĉeno ja kongruas kun sia PATTERN.

  La esprimo `konst \w+\b(?!\s*&)` kongruos ĉe const char en la ĉeno const char* foo dum ĝi ne povas kongrui kun const QString en const QString& bar ĉar la & kongruas kun la negativa antaŭrigarda aserta ŝablono.

`(?<=PATTERN)` (Pozitiva rigardo malantaŭe)

  Rigardu malantaŭen havas la saman efikon kiel la rigardo antaŭen, sed funkcias malantaŭen. Malantaŭrigardo rigardas la parton de la ĉeno antaŭ ebla kongruo. La pozitiva postrigardo kongruos kun ĉeno nur se ĝi estas antaŭita de la PATTERN de la aserto, sed la teksto kongrua per tio ne estos inkluzivita en la rezulto.

  La esprimo `(?<=cup)cake` kongruos ĉe cake se ĝi estas sekvata de cup (en cake sed ne en cheesecake aŭ en cake sole).

`(?<!PATTERN)` (Negativa postrigardo)

  La negativa postrigardo malhelpas ebla kongruo esti agnoskita se la antaŭa parto de la serĉita ĉeno ja kongruas kun sia PATTERN.

  La esprimo `(?<![\w\.])[0-9]+` kongruos ĉe 123 en la ĉenoj =123 kaj -123 dum ĝi ne povas kongrui kun 123 en .123 aŭ vorto123.

`(ŜABLONO)` (Kaptanta grupo)

  La subŝablono ene de la krampoj estas kaptita kaj memorita, tiel ke ĝi povas esti uzata en retroreferencoj. Ekzemple, la esprimo `(&quot;+)[^&quot;]*\1` kongruas kun `""""text""""` kaj `"teksto"`.

  Vidu la sekcion Kapti kongruan tekston (retroreferencoj) por pliaj informoj.

`(?:PATTERN)` (Ne-kapta grupo)

  La subŝablono ene de la krampoj ne estas kaptita kaj ne estas memorita. Estas preferinde ĉiam uzi nekaptajn grupojn, se la kaptoj ne estos uzataj.