Javascript正则表达式有例外

时间:2013-10-11 10:30:46

标签: javascript regex

我在一些javascript代码中使用RegExp,我用它来替换看起来像这样的字符串:

  

[1]

看起来像这样:

  

[2]

这一切都可以,但是我只想这样做,如果前面的字符不是:

  

所以

某事[1] 应成为 某事[2]

但是

某事[1] [somethingelse] [1] 应该成为 某事[2] [somethingelse] [1]

我目前的代码如下:

var first = 1;
var count = 2;
var pattern = escapeRegExp("[" + first + "]");
var regex = new RegExp(pattern, 'g');

$(this).html().replace(regex, '['+count+']'));

任何建议表示赞赏。

由于

3 个答案:

答案 0 :(得分:2)

您可以在[1]部分之前使用否定字符类,它将匹配]以外的任何字符。并将其捕获到一个组中:

var pattern = escapeRegExp("([^\\]])[" + first + "]");
var regex = new RegExp(pattern, 'g');

$(this).html().replace(regex, '$1['+count+']'));

答案 1 :(得分:2)

您需要的是Lookarounds。试试这个正则表达式:

/(?<!\[)\[1\]/[2]/

编辑:因为我刚刚得知JS不支持这个,你可以尝试否定字符类。

/[^\[]\[1\]/[2]/

答案 2 :(得分:1)

作为缺少的lookbehind的替代品,捕获组中的前一个char并在替换时将其放回:

str = "foo[1] bar[2] baz[3][somethingelse][1]"
re = /([^\]])\[(\d+)\]/g
str.replace(re, function($0, $1, $2) { 
   return $1 + '[' + (1 + Number($2)) + ']' 
})

> "foo[2] bar[3] baz[4][somethingelse][1]"