如何获得[.*]
的所有匹配项,但是如果括号是反斜杠转义的,如\[.*\]
?正则表达式匹配[]但不是 []
我可以使用JavaScript函数new RegExp("\\[.*\\]", "g")
获取全部[.*]
。我如何排除所有\[.*\]
(转义括号)?
输入如下:
div\[data-custom-attribute='References'\][matchme]
在这种情况下,正则表达式应该匹配[matchme]
。
如何获得[.*]
的所有匹配项,但是如果括号是反斜杠转义的,如\[.*\]
?正则表达式匹配[]但不是 []
我可以使用JavaScript函数new RegExp("\\[.*\\]", "g")
获取全部[.*]
。我如何排除所有\[.*\]
(转义括号)?
输入如下:
div\[data-custom-attribute='References'\][matchme]
在这种情况下,正则表达式应该匹配[matchme]
。
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.
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))。 –
@ RoryO'Kane啊你是对的。我认为使用两个表达式是明智的,至少就JS而言,每个表达式都有一个表达式。或者,我使用一个表达式更新了我的评论,这似乎能够捕捉到这两种情况,但它取决于转义块的位置取代了分组结果。想不到更好的解决方案。 – dav
为什么你的测试字符串不包含任何反斜杠?字符串中的单个反斜杠会转义下一个字符(如果有的话),因此您的单个反斜杠实际上并不是字符串的一部分,这意味着您不能准确测试数据。举一个真实的例子,你的第一个正则表达式不起作用:http://jsfiddle.net/A6XBH/1/ – Ian
使用非开捕团,如[^\\]
:
[^\\]\[.*[^\\]\]
我认为你要找的短语是*非捕获*组,但是你在那里得到的实际上是否定字符类,它并不能解决问题。首先,你的正则表达式在字符串的开始处不会匹配'[test]',因为它需要在打开'['之前消耗一个字符。您可能会考虑负面后顾,但JavaScript不支持这些内容。 –
嗯...完全正确,感谢那些精度! – zessx
最大的问题是要知道你是否正在寻找一个转义支架(\[
)或遵循一个转义反斜线支架(\\[
)。这是很容易的,如果你只是在寻找一个匹配:
/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/
第一部分吃掉不是反斜线或方括号以外的任何字符。如果它看到一个反斜杠,它会抓住它和下一个字符,不管它是什么。它会尽可能多地重复该过程,而当它不能再这样做时,接下来的事情必须是要查找的括号内的值(或“标记”)。它在#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);
}
为什么不使用正则表达式文字来创建正则表达式来void无法双重转义反斜杠? '/\[.*\]/ g' – hugomg