正则表达式匹配[]但不是\ [\]

时间:2013-06-24 15:33:03

标签: javascript regex escaping

我怎样才能获得[.*]的所有匹配,但如果括号是\[.*\]的反斜杠转义,则不会?

我可以使用JavaScript函数new RegExp("\\[.*\\]", "g")来获取所有[.*]。如何排除所有\[.*\](转义括号)?

输入看起来像这样:

div\[data-custom-attribute='References'\][matchme]

在这种情况下,正则表达式应匹配[matchme]

3 个答案:

答案 0 :(得分:1)

http://rubular.com/r/16q3jSPHN0

[^\\](?:\]?(\[(.+?)\]))适用于大多数情况。

修改

这似乎与\[test\][test]不匹配,正如Rory指出的那样。为此,我不能在不使用多个正则表达式的情况下考虑良好的解决方案,但如果您只想一个,请尝试以下方法:http://rubular.com/r/QBqFAbqW9E

(?:[^\\](?:\]?(\[(.+?)\]))|((?:\]?(\[(.+?)\])))\\)

匹配组将在前3个中填充,如果带有转义括号的块在常规块后出现,则最后3个出现相反的块。

Match 1
1.   
2.   
3.  [test]
4.  [test]
5.  test
Match 2
1.  [test]
2.  test
3.   
4.   
5.   

答案 1 :(得分:1)

最大的问题是知道您是在查看转义括号(\[)还是在转义后的反斜杠(\\[)后面的括号。如果你只想找一场比赛,这很容易:

/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/

第一部分吞噬除反斜杠或方括号以外的任何字符。如果它看到反斜杠,它会抓住那个和下一个角色,无论它是什么。它会尽可能多地重复这个过程,当它不能再这样做时,接下来的事情必须是你正在寻找的括号内的值(或“标签”)。它在第1组中被捕获。

获取其余标签比较棘手。要与数据保持同步,您希望每个后续匹配都准确地从上一个匹配停止的位置开始。许多正则表达式都支持\G锚,仅用于此目的,但它对我们没有帮助。 JavaScript正在采用/y标志,这基本上是相同的,但你不能指望它。

这是适用于案例的解决方法:

/(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g

核心正则表达式是相同的,但捕获组现在处于先行之中。第一次,它开始在字符串的开头匹配,就像之前一样,但它会在第一个标签之前停止。前瞻确认标签存在,但不消耗它。下一场比赛开始时再次匹配标签,这次耗费它。同时,标签也会在#1组中捕获,因此您可以通常的方式访问它。

var regex = /(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g;
var match = regex.exec(subject);
while (match != null) {
    // tag is in match[1]
    match = regex.exec(subject);
}

答案 2 :(得分:0)

使用[^\\]之类的非抓取群组:

[^\\]\[.*[^\\]\]