2012-11-17 191 views

回答

3

考慮一種模式,您需要檢查單個位置中的各種事物,例如一堆不同的兩個字符模式。通常,您使用|交替操作:

/(ab|cd|ef)/ 

這就需要用到的()括號爲好。但是這些括號也是一個捕獲組。也許你真的不想要捕捉那些字符序列,只是檢查它們的存在,這是在非捕獲組開始發揮作用:

/(?:ab|cd|ef)/ 
+1

也許我不明白這個問題,但我正在努力解決這個問題。對我來說,它的內容如下:「當你想捕捉時你使用捕獲正則表達式......」。如果知道*捕獲*組*是否不是問題,那麼這就像問:「我什麼時候使用iPod,什麼時候使用筆」? – phant0m

2

你可能想團獨立它們表達捕獲的東西。例如:

abc(foo|bar)def 

如果你想匹配要麼「abdfoodef」或「abcbardef」,但沒有其他的變化,這是最簡單的表達。您必須使用()將兩個表達式分組才能使用|。但這也意味着(foo|bar)是第一個捕獲組。

如果你不想要或需要捕捉,它寫爲非捕獲組

abc(?:foo|bar)def 
0

捕捉/非獲取並不是指整個正則表達式,但到組,即加括號的表達式

你想

  • 使用反向引用
  • 檢索一個整個比賽的特定部分? (或多個)

如果,那麼你將要捕捉組。

如果,那麼你正在使用括號優先度控制並且可以使組非捕獲。

1

捕獲組允許您重用部分正則表達式匹配。您可以重複使用正則表達式裏面,或者事後例如在REPLACE語句:

考慮這樣的文字:1a2b3cdef7g9h 和這個表達式:([0-9] *)([AZ] *) 有兩大捕獲第一個是捕獲數字序列的第一個,第二個是捕獲字母序列的組。

因此,您可以使用replaceAll語句來保留使用第一個捕獲組($ 1)的數字或保留第二個($ 2)的字母。

// next line outputs : 12379 
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$1")); 

    // next line outputs : abcdefgh 
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$2")); 

但是當你使用非捕獲組(例如添加:?它無法捕捉的,它有時有用因此,例如:

// next line outputs : abcdefgh 
    // ([a-z]*) becomes the first capturing group because (?:[0-9]*) is a non-capturing group 
    System.out.println("1a2b3cdef7g9h".replaceAll("(?:[0-9]*)([a-z]*)", "$1")); 

嘗試在http://gskinner.com/RegExr 在屏幕的下方,你可以看到是你捕獲組

參見:http://www.regular-expressions.info/brackets.html

1

只是想我應該我你還可以創建一個名爲捕獲組像這樣ntion:

(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4})) 

這將匹配像(02) 9502 5697

一個電話號碼,然後,您可以使用它作爲一個反向引用,象這樣:

"s/(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4}))/\k<telephone>/g" 

哪隻會取代自己的比賽...但你可以創造性地使用它。

希望這會有所幫助。