2016-04-10 58 views
13

爲我的類之一我要描述下面的正則表達式::符號在正則表達式

\ B4 [0-9] {12}(?:[0-9] {3})\ b

據我所知,它選擇的數字是:以4開頭,後面跟着12個數字(每個數字在0-9之間),然後是另一個3位數字。

我不明白的是用分號(?:....)表示的問號。我嘗試過在網上查找這意味着什麼,但我發現的鏈接有點令人困惑;我希望有人能夠給我一個關於這個例子中問號所做的快速基本概念。

+0

:用於表示非捕獲組。你可以參考 http://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group – firec

回答

3

它被稱爲'非捕獲組',這意味着正則表達式而不是通過匹配內部的匹配來創建一個組,如同它會做的那樣(通常,括號會創建一個組)。

30

這將是答案。

當您使用(?:)時,表示group已匹配但未被捕獲以進行回參考,即未捕獲組。它沒有存儲在內存中以供稍後參考。

例如:

(34)5\1

這正則表達式意味着你再次34尋找34其次5然後。當然,你可以把它寫成34534,但有時captured group是一種複雜的模式,你無法事先預測。

所以無論是否匹配捕獲組應該再次出現。

Regex101 demo for back-referencing


背引用也可用於同時更換。

例如:

([A-Z]+)[0-9]+

此正則表達式將查找many大寫字母接着many數字。我希望用找到大寫字母替換整個模式。

然後,我會通過使用\1其代表背面引用第一捕獲組替換整個圖案。

Regex101 demo for replacement

如果更改爲(?:[A-Z]+)[0-9]+這將不再捕獲它,因此不能被引用了。

Regex101 demo for non-capturing group

A live answer.