2012-08-28 24 views
3
Pattern pattern = Pattern.compile("(\\S+)\\s+(.+?)\\s+(\\S+)"); 
Matcher matcher = pattern.matcher("IA HEART RATE 184"); 

所以我的問題是爲什麼上面的模式捕獲組2中的心率。不應該'。+'匹配一個或多個字符,包括空格字符,所以不應該組2捕獲心臟,因爲它後面跟着一個空格,應該匹配(。+?)\ s +正確?那麼它爲什麼與心率相匹配?有人可以幫助我澄清我對這個正則表達式的理解嗎?

P.S.我正在使用火柴()

回答

3

你沒有顯示你如何使用matcher,但我猜你正在使用its matches() method當你真正想要的是its find() methodmatches()需要匹配整個字符串的模式,唯一的方法是將組2設爲HEART RATE。 (如果第2組只是HEART,那麼第3組將是RATE,並且會有一個尾隨 184與該模式中的任何內容不匹配。)如果您使用find(),則組2將僅爲HEART,因爲這是最小子字符串必要的是允許模式匹配部分字符串。

您也可能會誤解+?的含義。它儘可能少地匹配,同時仍然導致總體匹配。 (.+?)\s+完全有能力匹配HEART RATE ;只是寧願匹配HEART ,只要這並不妨礙模式的其餘部分匹配。

+0

那麼爲什麼它剝離的空間不應該在第2組中捕獲空間還是隻有被括起來的東西總是被捕獲? – Phoenix

+1

@Phoenix:Re:「只有括號內容總是被捕獲」:正確。 '(...)'符號創建一個捕獲組。 – ruakh

相關問題