2013-09-30 5 views
0

Мой пример кода:Java: Regex выражение для LastIndexOf

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Test { 

    /** 
    * @param args 
    */ 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String str[] = {"A","B","C"}; 
     String s = "TEST FOR A STRING CONSTANT B. END."; 
     int retIndex = -1; 

     for (int i = 0, len = str.length; i < len; i++){ 
      //length-1 is because, we should not check the empty space unicode(\u0021) 

      int index = s.lastIndexOf(str[i]); 
      if(index>retIndex){ 
       retIndex = index; 
      } 
     } 
     System.out.println("RETINDEX"+retIndex); 

     Pattern pattern = Pattern.compile("A|B|C"); 
     Matcher m = pattern.matcher(s); 

     while(m.find()){ 
      retIndex = m.start(); 
      System.out.println(m.group()+" : "+m.end()+" : "+m.start()); 
     } 

     System.out.println("REGEX RETINDEX"+retIndex); 
    } 
} 

И я получил результат:

RETINDEX27 
A : 10 : 9 
C : 19 : 18 
A : 24 : 23 
B : 28 : 27 
REGEX RETINDEX27 

Я хочу только максимальный выход индекса. Не нужно выполнять остальные три цикла. Как изменить приведенный выше для моей потребности ?. Точно lastindexOf соответствует регулярному выражению.

Благодаря

+0

Что вы ожидаемый результат? –

ответ

9

Вы можете найти последнее вхождение регулярного выражения, написав жадный матч за все перед ним, например:

.*(A|B|C) 

Учитывая ваш тест Строка .* будет соответствовать все до последний B, и вы можете получить B из группы захвата.

Чтобы получить доступ к группе захвата использовать методы, которые принимают int аргумент:

Pattern pattern = Pattern.compile(".*(A|B|C)"); 
    Matcher m = pattern.matcher(s); 
    if (m.find()) { 
     retIndex = m.start(1); 
     System.out.println(m.group(1)+" : "+m.end(1)+" : "+m.start(1)); 
    } 
+0

Простой и элегантный. (Для безопасности, возможно, добавьте '(? S)' в начале, поэтому даже новые строки будут сопоставляться символом '. *'). –

+0

, но он возвращает m.start() как 0. why? – user1023675

+0

Образец в целом соответствует строке с самого начала. Вы должны получить начало группы захвата, чтобы получить индекс B: m.start (1) – Joni

Смежные вопросы