首先,原谅我的hacky代码,我只是想尝试一下,我第一次学习javascript.基本上,给定字符串"abc!random {3}"将意味着返回以"abc"开头并以0-3开始的随机数结束的字符串.
这是我有的:
var pattern=/!random{([^{]*?)}/gi;
var text="abc!random{3}def!random{4}ghi!random{!random{3}}";
while (pattern.test(text))
{
text=text.replace(pattern, Math.random() * parseInt("$1"));
}
Run Code Online (Sandbox Code Playgroud)
问题是parseInt函数.似乎1美元没有传递给它......它的价值被清除或者其他东西.如果我做:
text=text.replace(pattern, "$1");
Run Code Online (Sandbox Code Playgroud)
它正确地返回{}之间的内容,因此正则表达式正在工作,匹配存储在$ 1中.但是,只要我将它用作$ 1的参数,它的值似乎就被清除了.是什么赋予了?
要替换的第二个参数可以是替换整个匹配的字符串,在该字符串中,如果存在,则所有出现的$ 1,$ 2等都被捕获替换或者它可以是一个带有两个参数的函数(匹配和捕获)并返回捕获的替换字符串:
var pattern=/!random{([^{]*?)}/gi;
var text="abc!random{3}def!random{4}ghi!random{!random{3}}";
text=text.replace(pattern,
function(match,capture)
{
return Math.random() * parseInt(capture)
});
WScript.echo(text);
Run Code Online (Sandbox Code Playgroud)
请注意,while循环是不必要的:正则表达式已经设置了全局标志("g"),表示全局处理正则表达式.
另请注意,该函数实际上接收多个(m)参数:1 =匹配的字符串,2..m =从左到右的捕获,m + 2 =匹配发生的字符串内的偏移量,m + 3 =整个字符串匹配.JavaScript允许省略最右边的参数(任何函数),这就是为什么示例只有两个.