正则表达式匹配可选组,除非它里面有东西

时间:2014-01-04 11:47:41

标签: javascript regex

我正在玩这个正则表达式:http://regex101.com/r/dL3qX1

!\[(.*?)\](?:\(\)|\[\])?

以下所有字符串都应匹配。但是,如果第二组括号(可选)包含其中的任何内容,则正则表达式应该不匹配。

// Match
![]
![caption]
![]()
![caption]()
![][]
![caption][]

// No match
![][No match]
![caption][No match]
![](No match)
![caption](No match)

我仍然可以匹配在行尾有文字的示例。

![] hello
![caption][] hi there

换句话说,如果没有可选组,我只想要匹配,或者如果有,我只想要一个匹配,如果可选组是空的(括号之间没有)。

我可以追求的是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

^!\[[^\]]*\](?:\(\)|\[\])?$

工作演示:http://regex101.com/r/eX0sR8

请注意在第一个方括号中使用[^\]]*代替.*?,以确保匹配到第一个]。使用行开始/结束锚^ and $

也更好

答案 1 :(得分:1)

我个人更喜欢在括号中使用否定类:

^!\[([^\[\]]*)\](?:\(\)|\[\])?$

regex101 demo

我将(.*?)替换为[^\[\]]*,分别在开头和结尾添加^$

也就是说,如果我理解了你正在寻找的东西,那么只有第一套是匹配的。