如何创建一个正则表达式来匹配最后一次出现的东西?

时间:2013-07-11 15:55:21

标签: javascript regex

我有一个看起来像这样的字符串:

one[two][three][four]

我想捕获最后一个括号的内容,所以我尝试了这个:

/\[(.*)\]$/

然而,这返回了以下结果:

two][three][four

如何将正则表达式设置为仅匹配最后一个括号的内容?

6 个答案:

答案 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)

我已经测试了

RegexPlanetJTexy 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)

怎么样 \[[^\[]*$ ?这匹配一个'[',后面没有其他',然后返回任何内容。