public class Filtre extends Zoznam<Filtre.Filter>
Táto trieda zoskupuje a zjednodušuje prácu s regulárnymi výrazmi.
V podstate ide o zaobalenie práce triedami Pattern
a Matcher
. Okrem toho implementuje jedno z častých
použití regulárnych výrazov – aplikovanie zoznamu filtrov na zadaný
reťazec.
Táto trieda reprezentuje zoznam filtrov, ktoré
budú postupne aplikované na reťazec zadaný ako parameter metódy použi
. Každý z filtrov môže mať nastavený príznak zastav
, ktorého hodnota true
indikuje, že sa
má spracovanie po úspešnej aplikácii tohto filtra (ako prvku v zozname
filtrov) zastaviť (a nemá sa pokračovať ďalším filtrom v rámci zoznamu).
Príklady použitia:
Nižšie sú fragmenty kódov demonštrujúce rôzne situácie. (Sú v nich použité rôzne spôsoby konštrukcie filtrov.)
Prvý príklad odfiltruje meno šablóny PNG sekvencie a vytvorí z neho meno konfiguračného súboru časovania.
final
String
názovPoložky ="animácia-***.png"
;final
Filtre
filterNázvuSúboru =new
Filtre
(new
Filtre
.Filter
("-?\\*+-?"
,"-"
),new
Filtre
.Filter
("(?i:\\.png$)"
,".tim"
),new
Filtre
.Filter
("-+\\.tim"
,".tim"
));String
názovSúboru = filterNázvuSúboru.použi
(názovPoložky);System
.out
.println
("názovSúboru: "
+ názovSúboru);
Výsledok:
názovSúboru: animácia.tim
V druhom príklade filtre hľadajú adresy v atribútoch href
HTML
kódu, ale len v tele HTML dokumentu:
String
odpoveď ="<!DOCTYPE html>\r\n<html>\r\n<head>"
+"\r\n<meta charset=\"UTF-8\" />\r\n<title>Titulok</title>"
+"\r\n<link href=\"style.css\" rel=\"stylesheet\" "
+"type=\"text/css\" />\r\n</head>\r\n\r\n<body>\r\n\r\n"
+"<header><h1>Nadpis v hlavičke</h1></header>\r\n\r\n"
+"<section>\r\n\r\n<div>\r\n\t<p><a href=\"https://"
+"pdf.truni.sk/\">Pedagogická fakulta</a></p>\r\n</div>"
+"\r\n\r\n</section>\r\n</body>\r\n</html>"
;final
Filtre
hľadajAdresy =new
Filtre
("[ \r\n\t]+"
," "
,".*?<body"
,""
,".*?href=\"([^\"]+)"
,"$1\n"
,"[^\n]+$"
,""
);final
Pattern
rozdeľAdresy =Pattern
.compile
("\n"); odpoveď = hľadajAdresy.použi
(odpoveď);final
String
[] adresy = rozdeľAdresy.split
(odpoveď);for
(String
adresa : adresy)System
.out
.println
("adresa: "
+ adresa);
Výsledok:
adresa: https://pdf.truni.sk/
Tretí príklad spojí riadky kódované algoritmom Base64 do jedného reťazca
a odfiltruje začiatočný identifikátor data:…
.
final
Filtre
spojBase64 =new
Filtre
(); spojBase64.pridaj
("^\\s*data:.*?;base64,"
,""
); spojBase64.pridaj
("\\s+"
,""
);String
naSpojenie ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg"
+"CAYAAABzenr0AAABb0lEQVR42mN48IDh/0BihlEHjDqA\r\n\tFMV37jP/X3JZ/3/8kdT/"
+"ert6/rNvXPWfYcMGMFbePuV/xOFssDxIHdUdMPmC7X+F7dPhFuLDIHUg\r\n\t9VRxwM37"
+"bP8DDxUSZTE69j1QDNZPtgNAmp3316AYyrd56f/MY7H/V1/R/H/pLjdY3dW7HP83XVP5\r"
+"\n\tX3Ai4r/QlkUo6m32NuJ1BF4HoPs8+nDG/3N3+PD6COSopKPJGCFBsgNAcYhsCMh3pC"
+"RYkHpk/bjS\r\n\tBAOu1I6c4EA+JyeLIYcEyDxsuQOrA0BZCTnOCQU7vugQ3TIfbtbCy0"
+"bEOQCUz2GaQAmOkoIGOSpA\r\n\t5QRRDgAVMjBNoNROiQNAuQO5sCLKASwb18I1wbIauR"
+"iURZETI1EOwKeBrPKeVAcMeAgMeBoY8Fww\r\n\t4OXAgJeEA14X4KsNCeUKkHzasQTKa0"
+"Ny2wPIcU5xe2DAW0SDok2Ir1WMXGKCLAXlc1BWo0mreLRj\r\n\tMmwdAABfpbXzmG2kBQ"
+"AAAABJRU5ErkJggg=="
;String
spojené = spojBase64.použi
(naSpojenie);System
.out
.println
("spojené: "
+ spojené);
Výsledok:
Výsledkom bude reťazec vhodný na prevod z kódovania Base64 do binárneho tvaru (tu je umelo zalomený na zlepšenie čitateľnosti):
spojené: iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABb0lEQVR42mN48IDh/0BihlE HjDqAFMV37jP/X3JZ/3/8kdT/ert6/rNvXPWfYcMGMFbePuV/xOFssDxIHdUdMPmC7X+F7dPhFuLDIHU g9VRxwM37bP8DDxUSZTE69j1QDNZPtgNAmp3316AYyrd56f/MY7H/V1/R/H/pLjdY3dW7HP83XVP5X3A i4r/QlkUo6m32NuJ1BF4HoPs8+nDG/3N3+PD6COSopKPJGCFBsgNAcYhsCMh3pCRYkHpk/bjSBAOu1I6 c4EA+JyeLIYcEyDxsuQOrA0BZCTnOCQU7vugQ3TIfbtbCy0bEOQCUz2GaQAmOkoIGOSpA5QRRDgAVMjB NoNROiQNAuQO5sCLKASwb18I1wbIauRiURZETI1EOwKeBrPKeVAcMeAgMeBoY8Fww4OXAgJeEA14X4Ks NCeUKkHzasQTKa0Ny2wPIcU5xe2DAW0SDok2Ir1WMXGKCLAXlc1BWo0mreLRjMmwdAABfpbXzmG2kBQA AAABJRU5ErkJggg==
Posledný príklad hľadá riadky časových značiek titulkov vo formáte SRT a v nájdených riadkoch identifikuje počiatočnú a koncovú časovú známku.
final
Filtre
.Filter
filterČasu =new
Filtre
.Filter
("([0-9]+):([0-9]+):([0-9]+),([0-9]+)"
,null
);long
dajČas(String
s) {Matcher
ma = filterČasu.zhoda(s);if
(ma.matches()) {double
mili =Svet
.reťazecNaReálneČíslo
("0,"
+ ma.group(4
));return
Svet
.reťazecNaCeléČíslo
(ma.group
(1
)) *3600000
+// hr
Svet
.reťazecNaCeléČíslo
(ma.group
(2
)) *60000
+// mt
Svet
.reťazecNaCeléČíslo
(ma.group
(3
)) *1000
+// sc
(long)(mili *1000.0
);// ms
}return
-1
; }
final
Filtre
.Filter
časTitulkov =new
Filtre.Filter
("^\\s*([0-9:,]+)\\s*-->\\s*([0-9:,]+)\\s*$"
,null
);String
[] titulky = {"1"
,"00:00:00,000 --> 00:00:02,750"
,"No a teraz úplná zmena."
,""
,"2"
,"00:00:03,500 --> 00:00:07,500"
,"Toto je úplne neznámy chlapík:"
,"Thomas Fantet de Lagny"
,""
,"3"
,"00:00:07,875 --> 00:00:09,750"
,"To je matematik…"
, };for
(String
údaj : titulky) {if
(údaj.isEmpty
())continue
;Matcher
ma = časTitulkov.zhoda
(údaj);if
(ma.matches
()) {long
začiatok = dajČas(ma.group
(1
));long
koniec = dajČas(ma.group
(2
));// …
System
.out
.println
("začiatok: "
+ začiatok);System
.out
.println
("koniec: "
+ koniec); }else
System
.out
.println
("nie je čas"
); }
Výsledok:
nie je čas začiatok: 0 koniec: 2750 nie je čas nie je čas začiatok: 3500 koniec: 7500 nie je čas nie je čas nie je čas začiatok: 7875 koniec: 9750 nie je čas
Zoznam
,
Filtre.Filter
,
SerializovateľnosťModifikátor a typ | Trieda a opis |
---|---|
static class |
Filtre.Filter
Táto vnorená trieda je trieda prvkov zoznamu triedy
Filtre a zároveň môže slúžiť na sprostredkovanie jednoduchších úkonov
s regulárnymi výrazmi. |
Zoznam.ObratenyIterator<Typ>, Zoznam.ObrátenýIterátor<Typ>
capacityIncrement, elementCount, elementData
modCount
Konštruktor a opis |
---|
Filtre()
Predvolený konštruktor – vytvorí prázdny zoznam filtrov.
|
Filtre(Collection<Filtre.Filter> filtre)
Vytvorí zoznam filtrov obsahujúci zadané filtre.
|
Filtre(Filtre.Filter... filtre)
Vytvorí zoznam filtrov obsahujúci zadané filtre.
|
Filtre(String... filtre)
Vytvorí zoznam filtrov obsahujúci zadané filtre.
|
Modifikátor a typ | Metóda a opis |
---|---|
int |
citaj(String názovSúboru)
Alias pre
čítaj . |
int |
čítaj(String názovSúboru)
Prečíta zoznam filtrov zo zadaného konfiguračného súboru.
|
String |
dajNahradenie(int i)
Táto metóda slúži na zvýšenie pohodlia prístupu k šablóne nahradenia
filtra.
|
Pattern |
dajVzor(int i)
Táto metóda slúži na zvýšenie pohodlia prístupu ku vzoru filtra.
|
Matcher |
dajZhodu(int i)
Táto metóda slúži na zvýšenie pohodlia prístupu k inštancii zhody
filtra (
Matcher ). |
Matcher |
dajZhodu(int i,
String reťazec)
Táto metóda slúži na zvýšenie pohodlia prístupu k metóde
porovnávania zhody i-teho filtra so zadaným reťazcom.
|
int |
parsuj(String blokTextu)
Pridá filtre podľa zadaného bloku konfiguračného textu.
|
int |
parsuj(String[] konfiguračnéPole)
Pridá filtre podľa zadaného konfiguračného poľa.
|
String |
pouzi(String reťazec)
Alias pre
použi . |
String |
použi(String reťazec)
Použije na zadaný reťazec všetky filtre tejto inštancie.
|
void |
pridaj(String vzor,
String nahradenie)
Táto metóda slúži na pridanie nového filtra do tohto zoznamu
filtrov, ktorý bude vytvorený podľa zadaných parametrov (vzoru
a zhody).
|
aktualny, aktuálny, bolPrejdenyDokola, bolPrejdenýDokola, citaj, citaj, čítaj, čítaj, daj, daj, dalsi, dalsiPrvok, ďalší, ďalšíPrvok, dlzka, dĺžka, hladaj, hľadaj, hladaj, hľadaj, hladajOdzadu, hľadajOdzadu, hladajOdzadu, hľadajOdzadu, jePrazdny, jePrázdny, kapacita, nahodny, náhodný, nahodnyPrvok, náhodnýPrvok, nahrad, nahraď, najdi, nájdi, najdi, nájdi, najdiPosledny, nájdiPosledný, najdiPosledny, nájdiPosledný, naopak, naopak, nastav, obsahuje, odober, odober, odober, odoberOdKonca, odzadu, odzadu, pocet, pocitadlo, pocitadlo, pocitadloNaKoniec, pocitadloNaZaciatok, počet, počítadlo, počítadlo, počítadloNaKoniec, počítadloNaZačiatok, posledny, posledný, poslednyPrvok, poslednýPrvok, prazdny, prázdny, predchadzajuci, predchádzajúci, predchadzajuciPrvok, predchádzajúciPrvok, prejdenyDokola, prejdenýDokola, prepis, prepíš, presun, presuň, presun, presuň, presun, presuň, presun, presuň, pridaj, pridaj, pridaj, pridaj, prvy, prvý, prvyPrvok, prvýPrvok, tento, velkost, veľkosť, vloz, vlož, vrat, vráť, vrat, vráť, vymaz, vymaz, vymaz, vymazOdKonca, vymaž, vymaž, vymaž, vymažOdKonca, vymen, vymeň, vymen, vymeň, vymen, vymeň, vymen, vymeň
add, add, addAll, addAll, addElement, capacity, clear, clone, contains, containsAll, copyInto, elementAt, elements, ensureCapacity, equals, firstElement, forEach, get, hashCode, indexOf, indexOf, insertElementAt, isEmpty, iterator, lastElement, lastIndexOf, lastIndexOf, listIterator, listIterator, remove, remove, removeAll, removeAllElements, removeElement, removeElementAt, removeIf, removeRange, replaceAll, retainAll, set, setElementAt, setSize, size, sort, spliterator, subList, toArray, toArray, toString, trimToSize
parallelStream, stream
public Filtre()
Predvolený konštruktor – vytvorí prázdny zoznam filtrov.
public Filtre(Filtre.Filter... filtre)
Vytvorí zoznam filtrov obsahujúci zadané filtre.
filtre
– zoznam filtrov oddelený čiarkamipublic Filtre(Collection<Filtre.Filter> filtre)
Vytvorí zoznam filtrov obsahujúci zadané filtre.
filtre
– kolekcia obsahujúca zoznam filtrovpublic int čítaj(String názovSúboru)
Prečíta zoznam filtrov zo zadaného konfiguračného súboru. Metóda
očakáva v súbore zoradené dvojice alebo trojice riadkov s významom
„regulárny výraz“ (vzor), „nahradenie“ (šablóna) a nepovinný riadok
príznaku zastavenia spracovania (*
).
Dvojice/trojice riadkov môžu byť oddelené ľubovoľným množstvom
prázdnych riadkov.
Trojice sú od dvojíc odlíšené jednoducho: jediným platným tretím riadkom je riadok obsahujúci iba hviezdičku (čo je neplatný regulárny výraz, takže nemôže byť začiatkom ďalšej dvojice alebo trojice). Dvojice/trojice riadkov môžu byť oddelené prázdnymi riadkami na zlepšenie čitateľnosti konfiguračného súboru. Prázdne riadky sú ignorované, okrem jediného prípadu – ak ide o druhý riadok dvojice/trojice.
Technicky je fungovanie metódy je zariadené tak, aby nenastávali sporné situácie. Riadky sú čítané sekvenčne a sú vyhodnocované takto:
Príznak zastavenia indikuje, že proces filtrovania sa má po úspešnom spracovaní toho filtra, ktorý má tento príznak nastavený zastaviť (t. j., že sa nemá pokračovať ďalšími filtrami v zozname). Keby mali tento príznak nastavený všetky filtre v zozname, tak sa spracovanie zastaví po prvom úspešnom spracovaní reťazca niektorým z filtrov.
Príklady zoznamov filtrov:
Toto sú ukážky toho, ako môžu byť uložené v súboroch zoznamy filtrov prvých troch príkladov z hlavného opisu triedy:
-?\*+-? - (?i:\.png$) .tim -+\.tim .tim
[ \r\n\t]+ .*?<body .*?href="([^"]+) $1\n [^\n]+$
^\\s*data:.*?;base64, \ \\s+ §
Poznámka: Na indikáciu toho, že aktuálny
riadok neoznačuje začiatok nového filtra, ale vzťahuje sa k poslednému
filtru a mení jeho nastavenie bol úmyselne vybraný taký reťazec, aby
regulárny výraz, ktorý by mal oznaćovať nový filtre bol nezmyselný –
samostatná *
by znamenala „ľubovoľné opakovanie ničoho.“
Poznámka: Táto metóda nemaže zoznam filtrov,
takže počet úspešne pridaných filtrov sa dá zistiť podľa toho, ako sa
zmenila veľkosti zoznamu filtrov pred a po volaní tejto metódy. (Na
zistenie veľkosti zoznamu použite napríklad odvodenú metódu veľkosť
.)
názovSúboru
– názov súboru, z ktorého majú byť prečítané definície
filtrovpublic int parsuj(String blokTextu)
Pridá filtre podľa zadaného bloku konfiguračného textu. Blok textu
je rozdelený na riadky, ktoré sú spracúvané rovnako ako keby boli
prečítané zo súboru: pozri opis metódy čítaj
.
Poznámka: Táto metóda nemaže zoznam filtrov,
takže počet úspešne pridaných filtrov sa dá zistiť podľa toho, ako sa
zmenila veľkosti zoznamu filtrov pred a po volaní tejto metódy. (Na
zistenie veľkosti zoznamu použite napríklad odvodenú metódu veľkosť
.)
blokTextu
– blok konfiguračného textu obsahujúci definície filtrovnull
),
−2 ak bol zadaný prázdny reťazec (""
alebo
"\uFEFF"
– BOM)public int parsuj(String[] konfiguračnéPole)
Pridá filtre podľa zadaného konfiguračného poľa. Metóda považuje
pole reťazcov za riadky, ktoré sú spracúvané rovnako ako keby boli
prečítané zo súboru: pozri opis metódy čítaj
.
Poznámka: Táto metóda nemaže zoznam filtrov,
takže počet úspešne pridaných filtrov sa dá zistiť podľa toho, ako sa
zmenila veľkosti zoznamu filtrov pred a po volaní tejto metódy. (Na
zistenie veľkosti zoznamu použite napríklad odvodenú metódu veľkosť
.)
konfiguračnéPole
– konfiguračné pole obsahujúce definície filtrovnull
),
−2 ak bolo zadané prázdne polepublic void pridaj(String vzor, String nahradenie)
Táto metóda slúži na pridanie nového filtra do tohto zoznamu
filtrov, ktorý bude vytvorený podľa zadaných parametrov (vzoru
a zhody). V rámci tohto procesu je volaný konštruktor filtra, takže
platia rovnaké informácie ako v jeho opise: Filter.
Filter
(vzor,
nahradenie)
.
vzor
– regulárny výraz na porovnávanie reťazcov (ktoré budú
odovzdávané tomuto zoznamu filtrov prostredníctvom metódy použi
nahradenie
– šablóna reťazca na nahrádzanie zhôd podľa regulárneho
výrazu v parametri vzor
public Pattern dajVzor(int i)
public String dajNahradenie(int i)
Táto metóda slúži na zvýšenie pohodlia prístupu k šablóne nahradenia
filtra. Rovnaký efekt sa dá dosiahnuť volaním:
daj
(i).
nahradenie
.
public Matcher dajZhodu(int i)
public String použi(String reťazec)
Použije na zadaný reťazec všetky filtre tejto inštancie. Ak má
niektorý z filtrov v zozname nastavený príznak zastav
, tak sa spracovanie po úspešnom použití tohto filtra
automaticky zastaví.
reťazec
– reťazec na spracovanie