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

时间:2013-08-12 10:50:52

标签: javascript regex replace string-formatting printf

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

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 - 模式以使用百分之一而不是%key。< / p>

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以使其可以使用百分比%代替花括号{}

2 个答案:

答案 0 :(得分:0)

您可以使用此模式:

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

表示%符号后跟一个完整的单词。这不包括空白字符,下划线等。

如果你想要也能够使用这些角色,你可以写:

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

相当于:

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

答案 1 :(得分:0)

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

这不容易解决,因为有很多可能性可以看到结束你的格式,在这里你有一个标点符号在每个替换字符串的末尾,即一个句号{{1} }或逗号%arr[1].

因此,为了使您的工作能够在您的情况下,玩具可以用%obj.foo,替换原始模式中的},即

[\.,]

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