2014-09-27 134 views
-2

當我使用此代碼,我沒有預期的結果:簡單的Java正則表達式不

pattern = Pattern.compile("create\\stable\\s(\\w*)\\s\\(", Pattern.CASE_INSENSITIVE); 
    matcher = pattern.matcher("create table CONTACT ("); 
    if(matcher.matches()) { 
     for(int i =0; i<matcher.groupCount();i++) { 
      System.out.println("table : " + matcher.group(i) + matcher.start(i) + " - " + matcher.end(i)); 
     } 
    } 
} 

我希望趕上接觸,但正則表達式趕上整個表達式「CREATE TABLE CONTACT(」。 有人曾經對問題的想法?

感謝

+0

打印組索引1. – 2014-09-27 14:38:51

+0

http://regex101.com/r/lS5tT3/66它確實捕獲組1中的'contact' – vks 2014-09-27 14:39:24

+0

非常感謝你們。我雖然如果正則表達式匹配groupCount將返回2(整個表達式和組捕獲)。 – 2014-09-27 14:41:42

回答

1

的正則表達式引擎實際上將整個正則表達式統計爲一個組。你的正則表達式中的第一個組實際上是匹配返回的第二個組,它在索引1處。

如果你忽略第一組,那麼你應該在第二組中找到你要找的。

該組未被您的代碼打印的原因是groupCount不會將整個正則表達式計爲一個組,因此您只能在循環中獲得1個組。

組零表示按照慣例的整個模式。這不包括在這個計數中。

您可能不需要循環,您可以直接使用group(1)來提取所需的字符串。

0

集團數量從1開始,而不是從0

以下表達式:

matcher.group(i) 

應改爲:

matcher.group(i+1) 

或者乾脆打印組1,如果你想只打印組:

System.out.println("table: " + matcher.group(1));