1

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

one[two][three][four]

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

/\[(.*)\]$/

但是,这返回了以下结果:

two][three][four

如何形成正则表达式以仅匹配最后一个括号的内容?

4

6 回答 6

5

您正在使用贪婪的量词,它读取 first[和 last之间的所有内容]。您可以使用以下正则表达式:

/\[([^\]]*)\]$/  

如果有机会,您]不在字符串的末尾,那么您可以使用添加另一个字符类来匹配任何字符,但[]结尾之前:

/\[([^\]]*)\][^\[\]]*$/

但是,老实说,这个问题应该更好地使用字符串操作而不是使用正则表达式来解决,就像@gdoron 的回答一样。

于 2013-07-11T15:57:49.573 回答
3

实际上,对于您的情况,您甚至不需要正则表达式:

var str = 'one[two][three][four]';
alert(str.substring(str.lastIndexOf('[') +1, str.lastIndexOf(']')));

它得到最后一个[和之间的子字符串]

于 2013-07-11T15:59:06.493 回答
1

正则表达式搜索从左到右开始..因此它匹配two][three][four..即使您使用它也不会工作.*?

你应该使用这个正则表达式

[^\[]+(?=\]$)

但我更喜欢这个

var output=input.substring(input.lastIndexOf("[")+1,input.lastIndexOf("]"));
于 2013-07-11T15:58:21.403 回答
1

我已经测试过了

.*(\[.*\])RegexPlanet,它给了我 [4] 组 1。

人们在谈论greedy,请注意也有所有格量词,例如.*+“更加贪婪”,有时可能有用。

PS:我从JTexy 项目中得到了很好的正则表达式课程- 见这里。它是 Java,但使用 PCRE。

于 2013-07-11T16:18:07.610 回答
0

贪婪的表情是你的朋友。他们会试图得到他们能得到的一切……然后在他们不能得到的时候就回溯。

为此,您可以预先添加大多数表达式,^.*这些表达式将从一开始就尝试尽可能多地匹配。将结尾留给您想要查找的任何内容。

因此,如果您只想捕捉结尾...尝试:

^.*\[(.*?)\]

让我们分解一下:

^          # start of string
.*         # as much as possible
\[         # opening square bracket
(.*?)      # capture the minimum possible (non-greedy)
\]         # closing square bracket
于 2013-07-11T15:56:29.743 回答
0

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

于 2013-07-11T16:01:05.127 回答