在Pattern
類中它說有兩種類型的正則表達式:捕獲和非捕獲,但我不明白區別。捕獲和非捕獲模式有什麼區別?
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special
他們如何不同?我什麼時候需要使用每一個?任何例子?
在Pattern
類中它說有兩種類型的正則表達式:捕獲和非捕獲,但我不明白區別。捕獲和非捕獲模式有什麼區別?
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special
他們如何不同?我什麼時候需要使用每一個?任何例子?
考慮一種模式,您需要檢查單個位置中的各種事物,例如一堆不同的兩個字符模式。通常,您使用|
交替操作:
/(ab|cd|ef)/
這就需要用到的()
括號爲好。但是這些括號也是一個捕獲組。也許你真的不想要捕捉那些字符序列,只是檢查它們的存在,這是在非捕獲組開始發揮作用:
/(?:ab|cd|ef)/
也許我不明白這個問題,但我正在努力解決這個問題。對我來說,它的內容如下:「當你想捕捉時你使用捕獲正則表達式......」。如果知道*捕獲*組*是否不是問題,那麼這就像問:「我什麼時候使用iPod,什麼時候使用筆」? – phant0m
你可能想團獨立它們的表達捕獲的東西。例如:
abc(foo|bar)def
如果你想匹配要麼「abdfoodef」或「abcbardef」,但沒有其他的變化,這是最簡單的表達。您必須使用()
將兩個表達式分組才能使用|
。但這也意味着(foo|bar)
是第一個捕獲組。
如果你不想要或需要捕捉,它寫爲非捕獲組:
abc(?:foo|bar)def
捕捉/非獲取並不是指整個正則表達式,但到組,即加括號的表達式。
你想
如果是,那麼你將要捕捉組。
如果不,那麼你正在使用括號優先度控制並且可以使組非捕獲。
捕獲組允許您重用部分正則表達式匹配。您可以重複使用正則表達式裏面,或者事後例如在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 在屏幕的下方,你可以看到是你捕獲組
只是想我應該我你還可以創建一個名爲捕獲組像這樣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"
哪隻會取代自己的比賽...但你可以創造性地使用它。
希望這會有所幫助。
反向引用允許您引用捕獲的。 –