我有这样的句子:
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;
};
你能帮助我用随机值而不是全局替换来替换每个模式吗?
我不知道如何循环正则表达式的结果来替换原始句子中的匹配(每次都有随机值)。
答案 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");
}
哈希,以增加灵活性。