我有一个看起来像这样的字符串:
one[two][three][four]
我想捕获最后一个括号的内容,所以我尝试了这个:
/\[(.*)\]$/
然而,这返回了以下结果:
two][three][four
如何将正则表达式设置为仅匹配最后一个括号的内容?
答案 0 :(得分:5)
您正在使用贪婪量词,它会在第一个[
和最后一个]
之间读取所有内容。您可以使用以下正则表达式:
/\[([^\]]*)\]$/
如果有可能,您的]
不在字符串的末尾,那么您可以使用添加另一个字符类来匹配除[
和]
之外的任何字符:
/\[([^\]]*)\][^\[\]]*$/
但是,老实说,使用字符串操作而不是使用正则表达式可以更好地解决这个问题,如@gdoron's answer.
答案 1 :(得分:3)
实际上,对于您的情况,您甚至不需要正则表达式:
var str = 'one[two][three][four]';
alert(str.substring(str.lastIndexOf('[') +1, str.lastIndexOf(']')));
它获取最后一个[
和]
答案 2 :(得分:1)
正则表达式搜索从左到右开始..它匹配two][three][four
..即使您使用.*?
你应该使用这个正则表达式
[^\[]+(?=\]$)
但我更喜欢这个
var output=input.substring(input.lastIndexOf("[")+1,input.lastIndexOf("]"));
答案 3 :(得分:1)
我已经测试了
RegexPlanet在JTexy project .*(\[.*\])
,它给了我[4]组。
人们在谈论贪婪,请注意,还有占有量词,如.*+
,“更贪婪”,有时可能有用。
PS:我从here得到了关于正则表达式的好教训 - 见{{3}}。它是Java,但使用PCRE。
答案 4 :(得分:0)
贪婪的表情是你的朋友。他们将尝试尽其所能......然后在他们不能的时候回溯。
为此,您可以在^.*
之前添加大多数表达式,这些表达式将尽可能地从头开始尝试匹配。将结尾留给您想要查找的内容。
所以如果你想抓住结束......试试:
^.*\[(.*?)\]
让我们打破这个:
^ # start of string
.* # as much as possible
\[ # opening square bracket
(.*?) # capture the minimum possible (non-greedy)
\] # closing square bracket
答案 5 :(得分:0)
怎么样
\[[^\[]*$
?这匹配一个'[',后面没有其他',然后返回任何内容。