Capitalize Regex Result from User

Capitalize Regex Result from User

本文关键字:User from Result Regex Capitalize      更新时间:2023-09-26

在我的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。如果用户想要在replaceWith中使用多个反向引用,例如替换([aeiou])和replaceWith $1$1,我也希望这样做。它还应该能够有多个反向引用,例如用uppercase($1)$2替换([a-zA-Z])([a-zA-Z]?)。最后,当用户在replaceWith中同时具有大写和小写字母时,我希望它能够工作,就像这样:将([a-zA-Z']+,*)([.,?!'s]|)([a-zA-Z']+|)替换为uppercase($1)$2lowercase($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];
});