I'm still not clear on exactly what you're doing, but something like this is what I'd probably write: var languages = ['elven','common','draconic','dwarven','infernal','neveruse'],
// escape all the characters in a string that need to be escaped for Regular Expressions
esRE = function (s) {
var escapeForRegexp = /(\\|\/|\[|\]|\(|\)|\{|\}|\?|\+|\*|\||\.|\^|\$)/g;
return s.replace(escapeForRegexp,"\\$1");
},
language = (function(){
var re = new RegExp('^!('+_.map(languages,esRE).join('|')+') ','i');
return function(s){
var res={
lang: 'unknown',
msg: s
};
res.msg=s.replace(re,function(c,m){
res.lang=m.toLowerCase();
if(res.lang === 'neveruse') {
return c;
}
return '!';
});
return res;
};
}());
It has the benefit of only having the languages specified in one place (and one special case for the neveruse language). I used lowercase for the language names (but the regular expression matches either case) because it's easier to get to a uniform key that way. Calling the language() function on a message context will return an object with lang and msg: language('!Dwarven foo bar baz');
{
lang: "dwarven",
msg: "!foo bar baz"
}
language('!neveruse foo bar baz');
{
lang: "neveruse",
msg: "!neveruse foo bar baz"
} language('!banana foo bar baz');
{
lang: "unknown",
msg: "!banana foo bar baz"
}