Výrazy pro PARSEC¤
Skupina výrazů PARSEC reprezentuje koncept Parser combinator.
Poskytuje způsob, jak kombinovat základní parsery za účelem konstrukce složitějších parserů na základě určitých pravidel. V tomto kontextu je parser funkce, která přijímá řetězec jako vstup a vytváří strukturovaný výstup, který indikuje úspěšné parsování nebo poskytuje chybové hlášení, pokud proces parsování selže.
Parsovací výrazy se dělí do dvou skupin: parsery a kombinátory.
Parsery lze považovat za základní jednotky nebo stavební bloky. Jsou zodpovědné za rozpoznávání a zpracování konkrétních vzorů nebo prvků ve vstupním řetězci.
Kombinátory jsou naproti tomu operátory nebo funkce, které umožňují kombinaci a skládání parserů.
Každý výraz pro parsování začíná předponou !PARSE..
!PARSE.DIGIT: Parsuje jednu číslici¤
Typ: Parser.
Synopsis:
!PARSE.DIGIT
Example
Vstupní řetězec: 2
!PARSE.DIGIT
!PARSE.DIGITS: Parsuje více číslic¤
Typ: Parser.
Synopsis:
!PARSE.DIGITS
min: <...>
max: <...>
exactly: <...>
Pole min, max a exactly jsou nepovinná.
Varování
Pole Exactly nelze použít společně s poli min nebo max. A samozřejmě hodnota max nesmí být menší než hodnota min.
Příklad
Vstupní řetězec: 123
!PARSE.DIGITS
max: 4
Další příklady
Parsování co nejvíce číslic:!PARSE.DIGITS
!PARSE.DIGITS
exactly: 3
!PARSE.DIGITS
min: 2
max: 4
!PARSE.LETTER: Parsuje jedno písmeno¤
Latinská písmena od A do Z, malá i velká písmena.
Typ: Parser.
Synopsis:
!PARSE.LETTER
Příklad
Vstupní řetězec: A
!PARSE.LETTER
!PARSE.CHAR: Parsuje jeden znak¤
Jakýkoli typ znaku.
Typ: Parser.
Synopsis:
!PARSE.CHAR
Příklad
Vstupní řetězec: @
!PARSE.CHAR
!PARSE.CHARS: Parsuje posloupnost znaků¤
Typ: Parser.
Synopsis:
!PARSE.CHARS
min: <...>
max: <...>
exactly: <...>
min, max a přesně jsou nepovinná.
Varování
Pole Exactly nelze použít společně s poli min nebo max. A samozřejmě hodnota max nesmí být menší než hodnota min.
Příklad
Vstupní řetězec: jméno@123_
!PARSE.CHARS
max: 8
Tip
Pro analýzu až do konce řetězce použijte !PARSE.CHARS bez polí.
Další příklady
Parsování co nejvíce znaků:!PARSE.CHARS
!PARSE.CHARS
exactly: 3
!PARSE.CHARS
min: 2
max: 4
!PARSE.SPACE: Parsuje jednu mezeru¤
Typ: Parser.
Synopsis:
!PARSE.SPACE
!PARSE.SPACES: Parsuje více mezer¤
Parsování co největšího počtu znaků mezery:
Typ: Parser.
Synopsis:
!PARSE.SPACES
!PARSE.ONEOF: Parsuje jeden znak z množiny znaků¤
Typ: Parser.
Synopsis:
!PARSE.ONEOF
what: <...>
!PARSE.ONEOF <...>
Příklad
Vstupní řetězec: Wow!
!PARSE.ONEOF
what: "!?"
!PARSE.NONEOF: Parsuje jeden znak, který není v množině znaků¤
Typ: Parser.
Synopsis:
!PARSE.NONEOF
what: <...>
!PARSE.NONEOF <...>
Příklad
Vstupní řetězec: Wow!
!PARSE.NONEOF
what: ",;:[]()"
!PARSE.UNTIL: Parsuje posloupnost znaků, dokud není nalezen konkrétní znak¤
Typ: Parser.
Synopsis:
!PARSE.UNTIL
what: <...>
stop: <before/after>
eof: <true/false>
!PARSE.UNTIL <...>
-
stop- určuje, zda se má znak stop analyzovat nebo ne. Možné hodnoty:beforeneboafter(výchozí). -
eof- udává, zda máme analyzovat až do konce řetězce, pokud není nalezen symbolwhat. Možné hodnoty:truenebofalse(výchozí).
Info
Pole `what` musí být jednoznakové. Lze však použít i některé bílé znaky, jako např. `tab`.
Příklad
Vstupní řetězec: 60290:11
!PARSE.UNTIL
what: ":"
Další příklady
Parsování až do symbolu: a zastavení před ním:
!PARSE.UNTIL
what: ":"
stop: "před"
!PARSE.UNTIL ' '
, symbol nebo do konce řetězce, pokud není symbol nalezen.
!PARSE.UNTIL
what: ","
eof: true
tab:
!PARSE.UNTIL
what: 'tab'
!PARSE.EXACTLY: Parsovat přesně definovanou posloupnost znaků¤
Typ: Parser.
Synopsis:
!PARSE.EXACTLY
what: <...>
nebo kratší verze:
!PARSE.EXACTLY <...>
Příklad
Vstupní řetězec: Hello world!
!PARSE.EXACTLY
what: "Hello"
!PARSE.BETWEEN: Parsuje posloupnost znaků mezi dvěma konkrétními znaky¤
Typ: Parser.
Synopsis:
!PARSE.BETWEEN
what: <...>
start: <...>
stop: <...>
escape: <...>
nebo kratší verze:
!PARSE.BETWEEN <...>
-
what- označuje, mezi kterými stejnými znaky máme provést parsování. -
start,stop- udává, mezi kterými různými znaky máme provést parsování. -
escape- označuje znak escape.
Příklad
Vstupní řetězec: [10/May/2023:08:15:54 +0000]
!PARSE.BETWEEN
start: '['
stop: ']'
Parsování mezi dvojitými uvozovkami:
!PARSE.BETWEEN
what: '"'
Parsování mezi dvojitými uvozovkami, zkrácená forma:
!PARSE.BETWEEN '"'
Parsování mezi dvojitými uvozovkami, přeskakuje interní dvojité uvozovky:
Vstupní řetězec:"jedna, "dva", tři"
!PARSE.BETWEEN
what: '"'
escape: '\'
!PARSE.REGEX: Parsuje posloupnost znaků, která odpovídá regulárnímu výrazu¤
Typ: Parser.
Synopsis:
!PARSE.REGEX
what: <...>
Příklad
Vstupní řetězec: FTVW23_L-C: Message...
Výstupní řetězec: FTVW23_L-C
!PARSE.REGEX
what: '[a-zA-Z0-9_\-0]+'
!PARSE.MONTH: Parsuje jméno měsíce¤
Typ: Parser.
Synopsis:
!PARSE.MONTH
what: <...>
nebo kratší verze:
!PARSE.MONTH <...>
what- udává formát názvu měsíce. Možné hodnoty:number,short,full.
Tip
Pomocí !PARSE.MONTH analyzujete název měsíce jako součást !PARSE.DATETIME.
Příklad
Vstupní řetězec: 10/May/2023:08:15:54
!PARSE.MONTH
what: 'short'
Další příklady
Parsování měsíce v číselném formátu:Vstupní řetězec:
2003-10-11
!PARSE.MONTH 'číslo'
Vstupní řetězec:
2003-OCTOBER-11
!PARSE.MONTH
what: 'full'
!PARSE.FRAC: Parsuje zlomek¤
Typ: Parser.
Synopsis:
!PARSE.FRAC
base: <...>
max: <...>
base- udává základ zlomku. Možné hodnoty:milli,micro,nano.max- udává maximální počet číslic v závislosti na hodnotěbase. Možné hodnoty:3,6,9.
Tip
Pomocí !PARSE.FRAC lze analyzovat mikrosekundy nebo nanosekundy jako součást !PARSE.DATETIME.
Příklad
Vstupní řetězec: Aug 22 05:40:14.264
!PARSE.FRAC
base: "micro"
max: 6
!PARSE.DATETIME: Parsování data v daném formátu¤
Typ: Parser.
Synopsis:
!PARSE.DATETIME
- year: <...>
- month: <...>
- day: <...>
- hour: <...>
- minute: <...>
- second: <...>
- nanosecond: <...>
- timezone: <...>
- Pole
month,dayjsou povinná. - Pole
yearje nepovinné. Pokud není zadáno, použije se funkce smart year. - Pole
hour,minute,second,microsecond,nanosecondjsou nepovinná. Pokud nejsou zadána, použije se výchozí hodnota 0. - Zadání pole mikrosekund jako
microsecond?, umožní parsovat mikrosekundy, pokud se vyskytují ve vstupním řetězci, a jinak ne. - Pole
timezoneje nepovinné. Pokud není zadáno, použije se výchozí hodnotaUTC. Lze jej zadat ve dvou různých formátech.Z,+08:00- analyzuje se ze vstupního řetězce.Evropa/Praha- zadáno jako konstantní hodnota.
Zkratky¤
K dispozici jsou tvary zkratek (v obou nižších/vyšších variantách):
!PARSE.DATETIME RFC3339
!PARSE.DATETIME iso8601
Příklad
Vstupní řetězec: 2022-10-13T12:34:56.987654
!PARSE.DATETIME
- year: !PARSE.DIGITS
- '-'
- month: !PARSE.MONTH 'číslo'
- '-'
- day: !PARSE.DIGITS
- 'T'
- hour: !PARSE.DIGITS
- ':'
- minute: !PARSE.DIGITS
- ':'
- second: !PARSE.DIGITS
- microsecond: !PARSE.FRAC
base: "micro"
max: 6
- timezone: "Europe/Prague"
Další příklady
Parsování data bez roku, s krátkým tvarem měsíce a volitelnými mikrosekundami:Vstupní řetězec:
Aug 17 06:57:05.189
!PARSE.DATETIME
- month: !PARSE.MONTH 'short' # Měsíc
- !PARSE.SPACE
- day: !PARSE.DIGITS # Den
- !PARSE.SPACE
- hour: !PARSE.DIGITS # Hodiny
- !PARSE.EXACTLY { what: ':' }
- minute: !PARSE.DIGITS # Minuty
- !PARSE.EXACTLY { what: ':' }
- second: !PARSE.DIGITS # Sekundy
- microsecond?: !PARSE.FRAC # Mikrosekundy
base: "micro"
max: 6
Vstupní řetězec:
2021-06-29T16:51:43+08:00
!PARSE.DATETIME
- year: !PARSE.DIGITS
- '-'
- month: !PARSE.MONTH 'číslo'
- '-'
- day: !PARSE.DIGITS
- 'T'
- hour: !PARSE.DIGITS
- ':'
- minute: !PARSE.DIGITS
- ':'
- second: !PARSE.DIGITS
- timezone: !PARSE.CHARS
Vstupní řetězec:
2021-06-29T16:51:43Z
!PARSE.DATETIME RFC3339
Vstupní řetězec:
20201211T111721Z
!PARSE.DATETIME iso8601
Vstupní řetězec:
2023-03-23T07:00:00.734323900
!PARSE.DATETIME
- year: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '-' }
- month: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '-' }
- day: !PARSE.DIGITS
- !PARSE.EXACTLY { what: 'T' }
- hour: !PARSE.DIGITS
- !PARSE.EXACTLY { what: ':' }
- minute: !PARSE.DIGITS
- !PARSE.EXACTLY { what: ':' }
- second: !PARSE.DIGITS
- nanosekunda: !PARSE.FRAC
base: "nano"
max: 9