在我的nodejs(javascript)程序中,用户可以输入文本并使用他们输入的正则表达式进行更改。我还希望用户能够输入大写或小写的文本。如果用户输入字符串“StackOverflow is Great!”、正则表达式(.),并将其设置为大写($1),则程序应返回“STACKOVERFLOW IS GREAT!”我可以这样做:
var text = "StackOverflow is great!";
var regexp = new RegExp("(.)", "g");
var replaceWith = "uppercase($1)";
var uppercaseMatch = /uppercase\(([^)]+)\)/g.test(replaceWith);
var lowercaseMatch = /lowercase\(([^)]+)\)/g.test(replaceWith);
var result = text.replace(regexp, function() {
var argsCount = arguments.length;
if(uppercaseMatch) {
if(argsCount === 5) {
return arguments[1].toUpperCase() + arguments[2];
} else if (argsCount === 4) {
return arguments[1].toUpperCase();
}
} else if (lowercaseMatch) {
if(argsCount === 5) {
return arguments[1].tolowerCase() + arguments[2];
} else if (argsCount === 4) {
return arguments[1].tolowerCase();
}
} else {
if(argsCount === 5) {
return arguments[1] + arguments[2];
} else if (argsCount === 4) {
return arguments[1];
} else if (argsCount === 3) {
return replaceWith;
}
}
});
console.log(result);
如果他们小写字符串,它也会起作用,然后它将返回“stackoverflow is Great!”如果他们不输入任何大写或小写文本,例如 [oO]
作为正则表达式,0
作为replaceWith,此代码也将正确运行。但是,它不适用于 \b(\w)
作为正则表达式,以及 uppercase($1)
作为替换。如果用户想在replaceWith中使用多个反向引用,例如替换([aeiou])
和replaceWith $1$1
,我也希望它能够工作。它还应该能够有多个反向引用,例如将 ([a-zA-Z])([a-zA-Z]?)
替换为 uppercase($1)$2
。最后,我希望当用户在replaceWith中同时有大写和小写时它能够工作,如下所示:replace ([a-zA-Z']+,*)([.,?!\s]| )([a-zA-Z']+|)
与 大写($1)$2小写($3)
。
最佳答案
我可以建议这样的事情:
function fnReplace(regex, from, to) {
return from.replace(regex, function() {
var args = [].slice.call(arguments, 0);
return to.replace(/(\w+)\(\$(\d+)\)|\$(\d+)/g, function(_, fn, a1, a2) {
return fn ? args[a1][fn]() : args[a2];
});
});
}
示例:
s = fnReplace(
/(\w+) (\w+)/,
'hello THERE',
'toUpperCase($1) + toLowerCase($2) + $2 $1');
console.log(s) // HELLO + there + THERE hello
它允许替换任意字符串函数:
s = fnReplace(
/(\w+) (\w+)/,
'hello THERE',
'bold($1) + sup($2)');
// <b>hello</b> + <sup>THERE</sup>
如果不需要,请将内部正则表达式更改为:
return to.replace(/(toUpperCase|toLowerCase|...)\(\$(\d+)\)|\$(\d+)/g, function(_, fn, a1, a2) {
return fn ? args[a1][fn]() : args[a2];
});
关于javascript - 将用户的正则表达式结果大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266679/