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:before
neboafter
(výchozí). -
eof
- udává, zda máme analyzovat až do konce řetězce, pokud není nalezen symbolwhat
. Možné hodnoty:true
nebofalse
(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
,day
jsou povinná. - Pole
year
je nepovinné. Pokud není zadáno, použije se funkce smart year. - Pole
hour
,minute
,second
,microsecond
,nanosecond
jsou 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
timezone
je 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