[MEGOLDVA] Javascript - regex problematics :o

Sziasztok

Regexel akadtam el egy template vezérlő készítése közben.
A lényeg, hogy a template objectemnek megadok egy mintát, amit elsőre feldarabol a vezérlők elhelyezkedése szerint, majd végigmegy a tömbön, és kiszedi a vezérlőket, helyükre pedig vagy .*ot vagy a vezérlő belsejében megadott regex kódot illeszti

kb így néz ki az egész:


var a=new Template("ez egy szám: </szam:[\\d]+/>")

ebből csinál olyat, hogy


["ez egy szám: ","</szam:[\\d]+>"]

na most ezt nyilván itt egy global flages regexel szedem szét
utána végigmegyek egy nem global flagessel, és azzal kapom szét a vezérlőt, vagy ha nem vezérlő, akkor escapelem, hogy ne zavarjon be majd regex gyártásnál.

a vezérlőből csinálok egy olyat, hogy


["szam","[\\d]+"]

majd hozzáírom a készülő regex forrásához a második részt, szóval a regex forrása, ami a minta alapján készült így néz ki:


"ez egy szám: ([\\d]+)"

szóval a "szam" hoz tartozó regexet beraktam egy capturing groupba, és ha ráillesztem ezek után egy stringre, akkor a backreference[1]ből tudom majd kinyerni.

tehát a végeredmény mondjuk ennél a stringnél:


"ez egy szám: 24"

"24" lesz a backreference[1]en, amit majd egy objectben adok vissza így:


{szam:"24"}

a problémám ezzel az egésszel annyi, hogy ha a vezérlőben megadott regex kódban is van capturing group, és nem csak egy vezérlő van, akkor eltolódik a backreference sorrendje, és más adatok fognak bekerülni a végén az objectbe, ami nem túl jó.. szóval szűrni szeretném a capturing groupos regexel rendelkező vezérlőket, vagy ha nem megy, akkor replaceelem a ( eket (?: ra

a másik gondom, hogy a vezérlőket kinyerő regex mohó, tehát ha ilyet írok, hogy


"</vmi/>/>/>"

akkor az egészet vezérlőnek veszi, nekem meg arra van szükségem, hogy az első /> nél lezárja a vezérlőt, tehát hogy ne legyen mohó a regex, és sajnos nem tudom, hogy hogy tudnám ezt elérni, mert mondjuk egy karakternél elég egy szimpla [^}]* több karakternél viszont így nem lehet megoldani az egymásutániságot

ismerek még olyat, hogy negative lookahead, amivel meg lehet oldani, a capturing group szűrést elméletileg így:


/\((?!\?[:=!])/

viszont ezt nem tudom, hogy hogy építsem be a kódomba

a mostani regexem így néz ki:


/<\/([\w$]+)\s*:?\s*(.*)?\/>/

ha valaki tud segíteni, vagy tanácsot adni, azt szívesen fogadom.

Üdv.
Laci

Hozzászólások

imho atomic group nélkül(javascript nem támogatja) nem lehet megcsinálni azt amit írtam, szóval nekem elég az, ha valaki megmondja, hogy hogy tudom elérni egy ilyennél
"/>/>/>"
hogy csak a

részt kepcsürölje

kaptam olyan tippet, hogy a ? utáni * al lehet a mohóságot leszedni a regexről, viszont még úgy is rajt hagy valamennyi />-t

Szerintem egy regexp alapú template-előnél felesleges az XML szintaktikát erőltetni.

Ha regexp, akkor valami printf-like szintaktika jöhet be.
Ha viszont XML szintaktika, akkor legyen tényleg XML, parsold be egy DOM-ba, és lehet vele játszani.

Szerk.: na jó, nem pont XML, de ugyanolyan kellemetlen parsolgatni :)

Az nem jo, ha server oldalon parse-olod szejjel, es kliensoldalra mar csak a JSON-t kuldod at?
A konkret peldaban talan macerasan megoldhato az ungreedy:


"</vmi/>/>/>"
"/<\/([^\/]+[^>])\/>/"

(nemtom javascript-fele regex szintaxisban a [] group-on belul kell-e escape-elni a / jelet.. ha nem kell, javitsd..)
ui: nem teszteltem, lehet hibas
---------------------
alert("This alert is here to inform you that alerts are annoying.");

na elmondom mit csinál egy template, mert úgy néz ki nem világos

elsőnek létrehozol egy template objectet


var template=new Template("The date of my birthday is: </year:[\\d]{4,4}/>.</month:[\\d]{2,2}/>.</day:[\\d]{2,2}/>");

itt megadtunk neki egy mintát, ő most ezt előre feldolgozza, hogy ha használjuk, akkor ne kelljen sokat dolgoznia a gépnek.

aztán mittomén van mondjuk 3 szülinapunk:


var birthdays=["The date of my birthday is: 1985.02.12","The date of my birthday is: 1987.02.24","The date of my birthday is: 1979.11.28"];

akkor végigmegyünk rajtuk egy forral, és Date objecteket csinálunk belőlük


var dates=[];
for (var i=0; i<birthdays.length; i++)
{
 var birthday=birthdays[i];
 birthday=template.extract(birthday);
 var date=new Date(0);
 date.setUTCFullYear(parseInt(birthday["year"],10));
 date.setUTCMonth(parseInt(birthday["year"],10)-1);
 date.setUTCDate(parseInt(birthday["day"],10));
 dates.push(date);
}

szóval kb ennyiről van szó

ja meg persze ez visszafele is működik:


alert(template.evaluate({year: "2006",month: "11",day:"23"}))

azt alertezi ki, hogy


"The date of my birthday is: 2006.11.23"

szóval ez a template egy általános object szövegek kezelésére, és ehhez kéne megcsinálni hogy a minta - ami jelen esetben

"The date of my birthday is: </year:[\\d]{4,4}/>.</month:[\\d]{2,2}/>.</day:[\\d]{2,2}/>"

volt - bevitelénél regexet készítsen, ami illeszkedik a megfelelő stringre.
mittomén ez olyasmi, mint a BBCODE vagy ezek, csak én nem []-t használok, hanem t, mert ilyet biztos, hogy nem fog beírni senki sehova egy oldalon, és mégis valami formája van, meg hasonlít az xml hez, én meg kinézetbe nagyon kicsit szerettem volna hajazni az xsl-templatehez