javascript - 将用户的正则表达式结果大写

标签 javascript regex node.js

在我的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/

相关文章:

javascript - JQuery 签名不适用于 IE <= 9

javascript - 穆尔特-S3 : TypeError: Cannot convert object to primitive valu…diate [as _immediateCallback]

php - 正则表达式挑战 : Capture all the numbers in a specific row

javascript - 用于显示 javascript、CSS、HTML 依赖项的工具

node.js - 在方法之间传递变量 Node.js Express.js

javascript - 灯箱不起作用,尽管加载了 jquery

javascript - 无法在我的单元测试中使用 Jest 渲染 Vue 组件

javascript - 正则表达式:匹配 MSSQL 连接字符串中的密码,考虑引号换行

Ruby:为什么等号在文字正则表达式中会导致解析错误?

node.js - 我可以从我的 NodeJS 应用动态创建 RabbitMQ 铲吗?