正则表达式匹配花括号

14

寻求帮助匹配正则表达式模式中的花括号。我已经尝试了不同的转义组合和符号匹配,但运气很差。也许是因为今天下午是星期五,我忽略了什么;但是您的想法将不胜感激。下面是代码:

function stringFormat(str, arr) {
   for (var i = 0; i < arr.length; i++) {
        var regExp = new RegExp('^\{' + i + '\}$', 'g');
        str = str.replace(regExp, arr[i]);   
    }
    return str;  
}

var str = '<p>The quick {0}, brown {1}</p>';

$('#test').html(stringFormat(str, ['brown', 'fox']));

我还在这个问题的jsfiddle上开始了一个尝试,http://jsfiddle.net/rgy3y/1/

3个回答

17

不要试图匹配一堆不同的数字,为什么不一下子全都匹配呢:

function stringFormat(str, arr) {
  return str.replace(
      /\{([0-9]+)\}/g,
      function (_, index) { return arr[index]; });
}

在你的例子中,

var str = '<p>The quick {0}, brown {1}</p>';

// Alerts <p>The quick brown, brown fox</p>
alert(stringFormat(str, ['brown', 'fox']));

这样做的好处是,如果arr包含类似“{1}”的字符串,也不会发生奇怪的事情。例如:
stringFormat('{0}',['{1}','foo'])=== '{1}'与原始版本的修复版一致,但与stringFormat('{1}',['foo','{0}'])=== '{0}'不一致。


谢谢Mike。感谢您的推荐,这将解决未来可能出现的问题。 - gnome
我使用了你的格式函数,但是我将其作为一个静态方法添加到String中,并使用arguments数组代替让用户传入一个数组。http://codetunnel.com/blog/post/string-replacement-is-natively-supported-by-consolelog - Chev
@Chev,你的链接好像挂了。友情提醒:arguments不是一个数组。 - user3362735
谢谢,这是链接。我知道lol,它是一种“类似数组的数据结构”,但我不会每次提到它时都说出来:P。它是可迭代的,这就是在这里最重要的 :)。 - Chev
"arguments在严格模式函数体中是一个数组"这个特性没有被纳入ES5吗? - Mike Samuel

9
要在字符串文字中得到一个反斜杠,你需要键入 \\。特别地,'\{' 等于 '{'。你想要的是 '\\{'

0

如果你不熟悉 JavaScript(或其他)正则表达式,但你只匹配包含 {X} 的表达式(或仅匹配具有该表达式的行,这取决于你的正则表达式)。
'^{' + i + '}$'

去掉 ^ 和 $。


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