2013-06-24 149 views
0

如何获得[.*]的所有匹配项,但是如果括号是反斜杠转义的,如\[.*\]正则表达式匹配[]但不是 []

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

输入如下:

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

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

+1

为什么不使用正则表达式文字来创建正则表达式来void无法双重转义反斜杠? '/\[.*\]/ g' – hugomg

回答

1

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

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

编辑:

看起来这将不匹配\[test\][test],如罗里指出。对于这一点,我真的不能相信一个的解决方案,而无需使用多个正则表达式,但如果你只想一个那就试试这个: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

JavaScript [不支持](http://www.regular-expressions.info/javascript.html)[lookbehind](http://www.regular-expressions.info/lookaround.html),所以这是你能做的最好的。但是,如果JavaScript做了,最好用'(?<!\\)'替换'[^ \\]',这样就可以匹配以'['开头的字符串,比如'[test] \ [test \ ]([before](http://rubular.com/r/Zu2TuNCVm7),[after](http://rubular.com/r/fop7evuIA5))。 –

+0

@ RoryO'Kane啊你是对的。我认为使用两个表达式是明智的,至少就JS而言,每个表达式都有一个表达式。或者,我使用一个表达式更新了我的评论,这似乎能够捕捉到这两种情况,但它取决于转义块的位置取代了分组结果。想不到更好的解决方案。 – dav

+0

为什么你的测试字符串不包含任何反斜杠?字符串中的单个反斜杠会转义下一个字符(如果有的话),因此您的单个反斜杠实际上并不是字符串的一部分,这意味着您不能准确测试数据。举一个真实的例子,你的第一个正则表达式不起作用:http://jsfiddle.net/A6XBH/1/ – Ian

0

使用非开捕团,如[^\\]

[^\\]\[.*[^\\]\] 
+2

我认为你要找的短语是*非捕获*组,但是你在那里得到的实际上是否定字符类,它并不能解决问题。首先,你的正则表达式在字符串的开始处不会匹配'[test]',因为它需要在打开'['之前消耗一个字符。您可能会考虑负面后顾,但JavaScript不支持这些内容。 –

+0

嗯...完全正确,感谢那些精度! – zessx

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); 
} 
相关问题