簡體   English   中英

如何創建一個正則表達式以匹配某個事物的最后出現?

[英]How to create a regular expression to match the last occurrence of something?

我有一個看起來像這樣的字符串:

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。

人們在談論貪婪 ,請注意,還有占有所有量詞,例如.*+ ,它“更貪婪”,有時可能有用。

PS:我從JTexy項目中學到了很好的正則表達式課程-請參見此處 它是Java,但使用PCRE。

貪婪的表情是你的朋友。 他們將嘗試獲得他們所能擁有的一切……然后在無法做到時回溯。

為此,您可以在大多數表達式前加上^.* ,它將從頭開始嘗試並盡可能地進行匹配。

因此,如果您只是想捕獲結尾,請嘗試:

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

讓我們分解一下:

^          # start of string
.*         # as much as possible
\[         # opening square bracket
(.*?)      # capture the minimum possible (non-greedy)
\]         # closing square bracket

\\[[^\\[]*$怎么樣? 這與后面沒有其他'['的'['相匹配,並在之后返回任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM