Regex-kvizo #1
Kaj estis koloro.Ni nur respondas la Regex-kvizo #1. La regex estis:
\[(#[a-fA-F0-9]{3,6}|[a-zA-Z]+)\](.+)\[\/\1\]
Por kio ĝi povas esti uzata? Jen kion ni klarigos en ĉi tiu afiŝo.
Ni disekcu la regex #
La kvizo enhavis indicon: oni bezonas Matcher
por ekspluati ĝin, do verŝajne ĝi ne nur testos ĉu la enigo kongruas kun ĝi.1
Ni koncentriĝu pri la regex.
Eskapi Krampojn #
Unue, ni rimarkas, ke la esprimo estas malagrabla legebla pro multaj eskapoj, precipe por krampoj: [
kaj ]
estas antaŭtitaj per \
, kio signifas, ke ili ne havas sian kutiman rolon en regex.
Anstataŭe, ili estas parto de la teksto, kiun ni serĉos, kiam ni provas la regex sur enigo.2
Kaptante grupojn #
Vi povas vidi du kaptante grupojn:
- Grupo #1 estas
(#[a-fA-F0-9]{3,6}|[a-zA-Z]+)
. Ĝi kaptos:- aŭ
#
sekvata de deksesuma ĉeno de tri ĝis ses signoj; - aŭ ĉeno de literoj.
- aŭ
- Grupo #2 estas
(.+)
. Ĝi kaptos ĉion inter]
kaj[
.
Reuzo de kaptitaj grupoj #
Estas unu apartaĵo, kiu eble ne estas evidenta, sed fundamenta por kompreni ĉi tiun regex: \1
certigos, ke la regex kongruas nur se la teksto en ĉi tiu loko estas la sama kiel tio estis kaptita de grupo #1.
Ekzemple, se la grupo 1 kaptis cyan
, tiam la regex kongruus nur se la teksto en la loko de la \1
ankaŭ estas cyan
.
Tio signifus, ke la enigo komenciĝus per [cyan]
kaj finiĝas per [/cyan]
.
Jes, tio estas etikedsistemo.
Bilanco #
Do, por resumi, ni havas:
- etikedsistemo;
- etikedoj kiuj enhavas HTML-koloron, aŭ en deksesuma formo aŭ kolornomo;
- enhavo.
Jes, tio estas sistemo por kolori la teksto, por anstataŭigi [red]This is important.[/red]
per <span style="color: red">This is important.</red>
.
Rapida kodo por fari ĝin estus:
1final String regex = "\\[(#[a-fA-F0-9]{3,6}|[a-zA-Z]+)\\](.+)\\[\\/\\1\\]";
2final String input = "[red]This is important.[/red]";
3
4Pattern pattern = Pattern.compile(regex);
5Matcher matcher = pattern.matcher(input);
6
7if (matcher.find()) {
8 String output = String.format(
9 "<span style=\"color: %s\">%s</span>",
10 matcher.group(1),
11 matcher.group(2)
12 );
13 System.out.println(output);
14} else {
15 System.out.println(input);
16}
La rakonto #
Kiel vi povas supozi, niaj uzantoj devis povi aldonu koloron al sia teksto, uzante redaktilon kiu manipulis nur neprilaboritan tekston. phpBB-similaj etikedoj ŝajnis sufiĉe facila solvo, kaj regex estis rapida maniero analizi ĝin.
Ĝi estas baza uzado, sed ĝi estas bela ekzemplo de \1
por kapti kongruajn etikedojn.
En nia kazo, ĉi tio ebligas nestumon de etikedoj se necese ([red]This is [#ff9900]very[/#ff9900] important.[/red]
), sed estas multaj aliak kazoj, kie ĉi tio povus esti same grava.
Ni vidos alian uzon de tiu lertaĵo en nia sekva regex-kvizo, post du monatoj.
La kvizo ankaŭ enhavis eraron. Kiam oni uzas Java, oni devas eskapi la eskapoj, kio malfaciligas legi la regex. Por koncentriĝi pri la regex en si mem, mi evitos Java en estontaj kvizoj. ↩︎
Vi povus ne eskapi la fermante
]
por fari ĝin iom pli facile legi.\[(#[a-fA-F0-9]{3,6}|[a-zA-Z]+)](.+)\[\/\1]
estas do ekvivalenta. ↩︎