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

3

我目前正在编写一个简单的格式化函数,用于替换字符串中的一些占位符。

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
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,使其能够使用百分比符号%而不是花括号{}

1
您需要使用%符号吗?如果%是字符串的一个合法部分,例如“%obj.foo%不是%obj.bar%的10%”,您该如何处理? - Adrian Wragg
所以显然,,应该结束一个标识符。然后你可以用[^%, ]替换[^% ]。但这意味着你的替换不能处理obj["a,b"]。你看,你需要实际解析JavaScript标识符(包括所有可能的嵌套),才能使其正常工作。 - Martin Ender
这个库可以作为参考,或者您可以直接使用它。 https://github.com/tarangkhandelwal/substitutor.js - Tarang
2个回答

0
你可以使用这个模式:
var regex = /%([^\b]+)/g;

这意味着一个以完整单词跟在%符号后面。这不包括空格字符、下划线等。

如果您想要使用这些字符,您可以编写:

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

这是相当于什么:

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

是的,目前看起来不错!然而,仍然存在一个问题。如果占位符后面跟着逗号,似乎它就无法工作 %arr[0], // => undefined - yckart

0

这是因为您修改后的正则表达式模式不知道何时停止匹配。在之前的模式中,它在以下}符号处终止。

这不是一个容易修复的问题,因为有许多可能性可以用来结束您的格式,例如在每个替换字符串的末尾加上一个标点符号,即句号%arr[1].或逗号%obj.foo,

因此,在您的情况下,要使其工作,您可以将原始模式中的}替换为[\.,],即:

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

这个方法可以实现,但是你的替换模式现在需要以句号或逗号结尾,我猜这不是你想要的。最好以已知字符结尾,比如%符号,这样你的匹配模式就会变成/% *([^% ]+) *%/g,格式为%obj.foo%,你可以通过双倍输出来输出一个%符号,即%obj.bar%%%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接