修改格式模式以替换字符串中的占位符

Modify formatting-pattern to replace placeholders in string

本文关键字:占位符 字符串 替换 格式 模式 修改      更新时间:2023-09-26

我目前编写了一个简单的格式化函数来替换字符串中的一些占位符。

var format = function (a, c) {
    return a.replace(/{ *([^} ]+) *}/g, function (b, a) {
        b = c;
        a.replace(/[^.|'[']]+/g, function (a) {
            b = b[a];
        });
        return b;
    });
};

语法使用当前的花括号表示法{key},我现在尝试修改RegExp-模式以使用1%而不是%key

var pattern = /{ *([^} ]+) *}/g;

我试着用百分比%替换括号{},但这仍然不能正常工作。

var pattern = /% *([^% ]+) */g;

原始模式在预期的以下条件下工作:

var data = {
    obj: {
        foo: 'Foo',
        bar: 'Bar'
    },
    arr: ['Foo', 'Bar']
};
var objTest = '{obj.foo}, is not equal to {obj.bar}.'
format(objTest, data) // => 'Foo, is not equal to Bar.'
var arrTest = '{arr[0]}, is not equal to {arr[1]}.'
format(arrTest, data) // => 'Foo, is not equal to Bar.'

如果我们使用我修改过的模式,似乎每个占位符替换后的最后一个字符都会被删除:

'%obj.foo, is not equal to %obj.bar.' // => 'undefined is not equal to Bar'
'%arr[0], is not equal to %arr[1]' // => 'undefined is not equal to Bar'

有什么想法吗?如何修改pattern,使其可以与百分比%一起使用,而不是与花括号{}一起使用?

您可以使用以下模式:

var regex = /%([^'b]+)/g;

这意味着后面跟着一个完整字的CCD_ 9符号。这不包括空白字符、下划线等。

如果你想同时使用这些字符,你可以写:

var regex = /%('S+)/g;

相当于:

var regex = /%([^'s]+)/g;

原因是您修改后的正则表达式模式不知道何时停止匹配。在上一个符号中,它终止于下面的}符号。

这不是一件容易解决的事情,因为有无数的可能性可以用来结束您的格式,在每个替换字符串的末尾都有一个标点符号,即句号%arr[1].或逗号%obj.foo,

因此,为了在您的情况下实现这一点,玩具可以用['.,](即)取代原始模式中的}

/% *([^% ]+) *['.,]/g

这是可行的,但现在你的替换模式需要总是用句号或逗号终止,我怀疑这不是你想要的。最好用一个已知字符(如%)终止,这将使您的匹配模式/% *([^% ]+) *%/g和格式%obj.foo%,并且您可以通过加倍输出%,即%obj.bar%%%