1

我正在尝试用 JavaScript 中的正则表达式替换字符串的某些部分,但前提是它们没有包含在{{{and}}}中。

我目前使用的系统会进行多个字符串替换,并将替换内容包含在这些括号中。因此,如果我用星期几(比如说星期四)替换“h”,替换将输出"{{{Thursday}}}". 如果替换再次发生,则字符串最终将变为"{{{T{{{Thursday}}}ursday}}}"星期四中的“h”已被替换。

我正在寻找的是一个正则表达式模式,它将替换“h”,但前提是它不包含在{{{and}}}包装器中。

提前致谢 :)

编辑:

这是一些示例代码。每个替换都包含在括号中,正则表达式模式使用 (?!{{{) 和 (?!}}}) 以避免过去的替换。

var string = 'n d m y',
    dayTextRegex = /(?!{{{)n(?!}}})/g,
    dayRegex = /(?!{{{)d(?!}}})/g,
    monthRegex = /(?!{{{)m(?!}}})/g,
    yearRegex = /(?!{{{)y(?!}}})/g;

string = string.replace(dayTextRegex, '{{{Monday}}}');
string = string.replace(dayRegex, '{{{04}}}');
string = string.replace(monthRegex, '{{{June}}}');
string = string.replace(yearRegex, '{{{2012}}}');

//string is now equal to "{{{Mon{{{04}}}ay}}} {{{04}}} {{{June}}} {{{2012}}}"
4

1 回答 1

0

更新

刚刚意识到这行不通,但现在把它留在这里,直到我弄明白为止。尽管如此,这很有趣:)

模仿正则表达式中的lookbehind和lookbehind断言:

var str = '{{{h}}}';
str.replace(/({{{)?h(}}})?/g, function($0, $1, $2) { 
    return $1 && $2 ? $0 : '{{{' +$0 + '}}}';
});

回报:

{{{h}}}

另见:http: //blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

更新 2

看看你是如何使用表达式的,我会用这个结构来代替:

string.replace(/[ndmy]/g, function($0) {
    switch ($0) {
        case 'n':
            return '{{{Monday}}}';

        case 'd':
            return '{{{04}}}';

        case 'm':
            return '{{{June}}}';

        case 'y':
            return '{{{2012}}}';
    }
})

输出:

{{{Monday}}} {{{04}}} {{{June}}} {{{2012}}}

这基本上执行了没有重叠的替换,因此您不必担心以前的大括号表达式。

于 2012-06-07T10:54:34.123 回答