2017-10-06 1 views
1

Je cherche une fonction qui namespace une chaîne, par exemple si je voulu namespace la chaîne suivante avec « MyLib »,Comment namespace une chaîne (par exemple 'a (x) + b' => 'Namespace.a (x) + Namespace.b')

"select('#input') + someconstant * otherconstant" 

sera changé pour

"MyLib.select('#input') + MyLib.someconstant * MyLib.otherconstant" 

BTW prend dans une chaîne en entrée, et retourne une autre chaîne

la raison pour laquelle je vouloir faire c'est parce que je suis en train d'écrire une interface utilisateur ich compare mes fonctions mathématiques personnalisées avec une autre bibliothèques fonctions mathématiques personnalisées, par exemple, l'utilisateur peut taper

"factorial(2) + sin(intpow(2, 4))" 

qui serait converti en

"MyCustomLib.factorial(2) + MyCustomLib.sin(MyCustomLib.intpow(2, 4))" 
/* and */ 
"OtherLib.factorial(2) + OtherLib.sin(OtherLib.intpow(2, 4))" 

Et puis je peux utiliser eval() pour évaluer (ne vous inquiétez pas de moi en utilisant eval, l'inquiétude au sujet de la question :))

ma fonction actuelle ressemble

const namespace = (str, ns) => { 
    ns = ns + '.'; // add the dot to the namespace 
    let s = String(str), 
     m, // the result of regex 
     re = /\w+/g, // only namespace words 
     a = 0; // because there are two strings, and i am 
      // only adding to one of them, 
      // i have to increase the index to make up for 
      // the difference between the two 
    while ((m = re.exec(str)) !== null) { // until there is no more words 
    // get the new string (put the namespace in) 
    // eg. "(junk) abc (junk)" => "(junk) Namespace.abc (junk)" 
    s = s.slice(0, m.index + a) + ns + s.slice(m.index + a); 
    a += ns.length; // add to the offset 
    } 
    return s; // return the parsed string 
}; 

str param est la chaîne d'entrée, et est l'ns param espace de noms

cela fonctionne, par exemple.

namespace("PI * sin(E)", "Math") === "Math.PI * Math.sin(Math.E)" 

mais cela ne fonctionne pas pleinement, à savoir

namespace("23", "abc"); /* === "abc.23" */ 

Circonstances où il place l'égalité "23"

des idées?

Répondre

-1

Vous pouvez utiliser re = /[A-z]+/g, à la carte uniquement des caractères de l'alphabet

+0

cela ne fonctionnera pas, sur ce « abc234 »? les variables peuvent se terminer par les nombres –

+0

hmm, wow merci de m'inspirer! Je suppose que –

+0

/[a-zA-Z] \ w */g fonctionne –