我有一个看起来像这样的字符串:
one[two][three][four]
我想捕获最后一个括号的内容,所以我尝试了这个:
/\[(.*)\]$/
但是,这返回了以下结果:
two][three][four
如何形成正则表达式以仅匹配最后一个括号的内容?
我有一个看起来像这样的字符串:
one[two][three][four]
我想捕获最后一个括号的内容,所以我尝试了这个:
/\[(.*)\]$/
但是,这返回了以下结果:
two][three][four
如何形成正则表达式以仅匹配最后一个括号的内容?
您正在使用贪婪的量词,它读取 first[
和 last之间的所有内容]
。您可以使用以下正则表达式:
/\[([^\]]*)\]$/
如果有机会,您]
不在字符串的末尾,那么您可以使用添加另一个字符类来匹配任何字符,但[
在]
结尾之前:
/\[([^\]]*)\][^\[\]]*$/
但是,老实说,这个问题应该更好地使用字符串操作而不是使用正则表达式来解决,就像@gdoron 的回答一样。
实际上,对于您的情况,您甚至不需要正则表达式:
var str = 'one[two][three][four]';
alert(str.substring(str.lastIndexOf('[') +1, str.lastIndexOf(']')));
它得到最后一个[
和之间的子字符串]
正则表达式搜索从左到右开始..因此它匹配two][three][four
..即使您使用它也不会工作.*?
你应该使用这个正则表达式
[^\[]+(?=\]$)
但我更喜欢这个
var output=input.substring(input.lastIndexOf("[")+1,input.lastIndexOf("]"));
我已经测试过了
.*(\[.*\])
在RegexPlanet,它给了我 [4] 组 1。
人们在谈论greedy,请注意也有所有格量词,例如.*+
“更加贪婪”,有时可能有用。
PS:我从JTexy 项目中得到了很好的正则表达式课程- 见这里。它是 Java,但使用 PCRE。
贪婪的表情是你的朋友。他们会试图得到他们能得到的一切……然后在他们不能得到的时候就回溯。
为此,您可以预先添加大多数表达式,^.*
这些表达式将从一开始就尝试尽可能多地匹配。将结尾留给您想要查找的任何内容。
因此,如果您只想捕捉结尾...尝试:
^.*\[(.*?)\]
让我们分解一下:
^ # start of string
.* # as much as possible
\[ # opening square bracket
(.*?) # capture the minimum possible (non-greedy)
\] # closing square bracket
怎么样
\[[^\[]*$
?这匹配一个没有其他 '[' 的 '[' ,并在之后返回任何内容。