如何在每次出现时使用随机值替换正则表达式?

时间:2016-06-23 12:08:35

标签: javascript regex random replace

我有这样的句子:

var str = 'The <adjective> <noun> and <noun> <title>';

我想用相关数组中的随机值替换每个<pattern>

在我之前的例子中,我希望得到类似的内容:

var adjectives = ['big' 'small' 'funny'];
var nouns = ['dog', 'horse', 'ship'];
var title = ['bar', 'pub', 'club'];

var str = 'The <adjective> <noun> and <noun> <title>';
var r = str.replacePatterns({ noun: nouns, adjective: adjectives, title: titles });
console.log(r); // The big horse and ship club

我几乎可以通过同一句话中两次相同的模式(例如<noun>)来解决这个问题。所以我只为每个模式生成一个随机值...

String.prototype.replacePatterns = function (hash) {

    var string = this,
        key;

    for (key in hash) {
        if (hash.hasOwnProperty(key)) {
            var randomValue = hash[key][Math.floor(Math.random() * hash[key].length)];
            string = string.replace(new RegExp('\\<' + key + '\\>', 'gm'), randomValue);
        }
    }

    return string;
};

你能帮助我用随机值而不是全局替换来替换每个模式吗?

我不知道如何循环正则表达式的结果来替换原始句子中的匹配(每次都有随机值)。

2 个答案:

答案 0 :(得分:3)

replace接受一个函数作为它的第二个参数,为每个替换调用它,并且可以返回要替换的值。因此,使用函数并将随机数生成移动到其中:

String.prototype.replacePatterns = function (hash) {

    var string = this,
        key,
        entry;

    for (key in hash) {
        if (hash.hasOwnProperty(key)) {
            entry = hash[key]
            string = string.replace(new RegExp('\\<' + key + '\\>', 'gm'), function() {
                return entry[Math.floor(Math.random() * entry.length)]
            });
        }
    }

    return string;
};

你在这里不需要它,但只是FYI,函数接收匹配的文本作为它的第一个参数,如果你的正则表达式中有捕获组(你没有),它将接收它们作为后续参数。详情请见the MDN page for String#replace,当然还有the spec

答案 1 :(得分:2)

您也可以使用正则表达式而不是循环。像

这样的东西
after

还添加了可选的[HttpGet] public IActionResult ServerError() { var exceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerFeature>(); if (exceptionHandlerFeature != null) { var exception = exceptionHandlerFeature.Error; //TODO: log the exception } return View("500"); } 哈希,以增加灵活性。