2014-09-27 97 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));