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