正则表达式匹配JavaScript中某些字符中未包含的字符串?

时间:2012-06-07 10:33:26

标签: javascript regex replace

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

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

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

提前致谢:)

编辑:

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

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}}}"

1 个答案:

答案 0 :(得分:0)

<强>更新

刚刚意识到这不起作用,但现在把它留在这里,直到我能弄明白。尽管如此,它仍然很有趣:)

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

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}}}

这基本上可以在没有重叠的情况下执行替换,因此您不必担心以前的支撑表达式。