通过调用自定义函数替换字符串以将var转换为子字符串 - Algo JS

时间:2014-01-18 19:58:53

标签: javascript regex string algorithm typescript

我正在尝试使用变量和参数来变换字符串来构建它。

The min length of __40 is 4. Max length is 16.

__ 40是另一个字符串键,我需要从字符串中提取键,转换它并用转换后的值(它将是键引用的字符串)替换它,为此我需要调用自定义函数[_getSentence()],可能在同一个句子中有几个键,我想做一个正则表达式,但它看起来很复杂,不是吗?另外我不知道我是否可以从正则表达式调用自定义函数,但我不这么认为。

也许拆分字符串以获取所有单词(按空格分割),每次检查单词是否以'__'开头,在这种情况下调用我的自定义函数,存储结果并用字符串替换当前单词。但是这个新字符串还可能包含我需要转换的另一个键。

这里使用的最佳算法是什么?如果有更好的解决方案,你呢?我应该工作。

我还必须处理可以发送的参数,但我不必管理子键的args。

这个函数在转换句子后由_getSentence()调用,用值替换args,但我想在这里管理子键。

/**
 * Replace the tags in the text by the args.
 * @param message      The message.
 * @param args          The args to replace in the message.
 * @returns {string}    The string built.
 */
Lang.prototype._replaceArgsInText = function (message, args, lang) {
        for (var i = 0; i < args.length; i++) {
            message = message.replace((this.PATTERN_ARGS + i), args[i]);
        }

        // Check if some of the args was other language keys.
        return message;
    };

修改 最终解决方案:

/**
 * Replace the tags in the text by the args.
 * @param message      The message.
 * @param args          The args to replace in the message.
 * @returns {string}    The string built.
 * @private
 */
private _replaceArgsInText(message: any, args: any, lang: string): string{
    for(var i = 0; i < args.length; i++){
        message = message.replace((this.PATTERN_ARGS+i), args[i]);
    }

    // Check if some of the args was other language keys.
    message = this._replaceSubKeys(message, /__\w+/g, this._languages[lang][this._FIELD_CONTENT_LANG]);

    return message;
}

/**
 * Replace the sub keys into the sentence by the actual text.
 * @param sentence
 * @param rx
 * @param array
 * @returns {string|void}
 * @private
 */
private _replaceSubKeys(sentence, rx, array): string{

    return sentence.replace(rx, function(i) {
        var subSentence = array[i];
        // TODO Check if that's an object or a string.
        if(typeof subSentence == 'string'){
            return subSentence;
        }else{
            console.log('not a string!')
            return null;
        }
    });
}

1 个答案:

答案 0 :(得分:1)

假设您在地图中将替换参数的名称作为键,您可以执行以下操作:

function replace(text, rx, map) {
  return text.replace(rx, function(k) { return map[k] });
}

var res = replace(
  "The min length of __40 is 4. Max length is 16.",
  /__\w+/g, // regex for the substitution format
  {__40: 'snake'}); // map of substitution parameters

正则表达式为/__w+/g,以匹配参数的格式以及字符串中的所有参数。小提琴here

我也在使用String.prototype.replace function,它也需要一个功能。