【问题标题】:Modify formatting-pattern to replace placeholders in string修改格式模式以替换字符串中的占位符
【发布时间】:2013-08-13 15:42:51
【问题描述】:

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

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

【问题讨论】:

  • 你需要使用%吗?您将如何处理 % 是字符串的合法部分,例如%obj.foo% is not 10% of %obj.bar%?
  • 显然,, 应该结束一个标识符。然后你可以用[^%, ] 替换[^% ]。但这意味着您的替换不适用于obj["a,b"]。你看,你需要真正解析 JavaScript 标识符(以及它们所有可能的嵌套),以使其正常工作。
  • 这个库可以作为参考,也可以直接使用。 github.com/tarangkhandelwal/substitutor.js

标签: javascript regex replace string-formatting printf


【解决方案1】:

你可以使用这个模式:

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

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

如果您也希望能够使用这些字符,您可以编写:

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

相当于:

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

【讨论】:

  • 是的,到目前为止看起来不错!然而,仍然存在一个问题。如果占位符后跟逗号,它似乎不起作用%arr[0], // => undefined
【解决方案2】:

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

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

因此,要在您的案例中进行这项工作,玩具可以将原始模式中的 } 替换为 [\.,]

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

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

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多