我怎样才能获得[.*]
的所有匹配,但如果括号是\[.*\]
的反斜杠转义,则不会?
我可以使用JavaScript函数new RegExp("\\[.*\\]", "g")
来获取所有[.*]
。如何排除所有\[.*\]
(转义括号)?
输入看起来像这样:
div\[data-custom-attribute='References'\][matchme]
在这种情况下,正则表达式应匹配[matchme]
。
答案 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)
使用[^\\]
之类的非抓取群组:
[^\\]\[.*[^\\]\]