日期:2014-05-20  浏览次数:20553 次

问一个正规表达式中的Matcher的问题
public   static   void   main(String   args[])
{
      System.out.println(getRegExpValByIdx( "[0-9]+ ", "%$^%11     12113$Goodfdf678()) ",2));
}

public   static   String   getRegExpValByIdx(String   regExp,String   oriStr,int   idx)
{            
Pattern   p=Pattern.compile(regExp);
Matcher   matcher=p.matcher(oriStr);
matcher.start(idx);
String   result=null;
if(matcher.find(idx))
      result=matcher.group();
return   result;
}

这个getRegExpValByIdx是想返回第idx个匹配的字符串,   无论idx参数设为什么,都只返回第一个匹配的的字符串.


------解决方案--------------------
public static String getRegExpValByIdx(String regExp, String oriStr, int idx) {
Pattern p = Pattern.compile(regExp);
Matcher matcher = p.matcher(oriStr);
// matcher.start(idx); 在分组的模式下,此方法是返回以前匹配的匹配操作期间,由给定组所捕获的子序列的初始索引。
String result = null;
for(int i=0;matcher.find();i++){
if(i==idx){
result = matcher.group();
}
}
return result;
}
------解决方案--------------------
以下:
public static void main(String args[])
{
System.out.println(getRegExpValByIdx( "[0-9]+ ", "%$^%11 12113$Goodfdf678()) ",3));
}

public static String getRegExpValByIdx(String regExp,String oriStr,int idx)
{
Pattern p=Pattern.compile(regExp);
Matcher matcher=p.matcher(oriStr);

String result=null;
int index = 1;
while(matcher.find()){
if(idx == index){
result=matcher.group();
break;
}
index++;
}
return result;
}
------解决方案--------------------
一个正则表达式,默认整个表达式算一个组,其余每对括号算一个组,每次匹配完之后,就会有若干个匹配组,start(int idx)返回的是相应组的起始索引.比如一个正则表达式1(23)(45)存在3个组,整体是0组,(23)是1组,(45)是2组,对12345进行匹配,start(0)返回12345的起始索引0,start(1)返回23起始索引1,start(2)返回45索引3.