Разбор текста с конца (с использованием регулярных выражений) - PullRequest
1 голос
/ 20 января 2009

У меня, казалось бы, простая проблема, хотя я не могу обойти ее.

Допустим, у меня есть следующая строка: 'abcabcabcabc', и я хочу получить последнее вхождение 'ab'. Есть ли способ, которым я могу сделать это без , перебирая все другие 'ab с начала строки?

Я читал о привязке конца строки и последующем анализе строки с необходимым регулярным выражением. Я не уверен, как это сделать в Java (это поддерживается?).

Обновление: Полагаю, я сильно запутался с моим (слишком) упрощенным примером. Позвольте мне попробовать другой. Скажем, у меня есть такая строка: '12 / 08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more ' Здесь я хочу последняя дата и, следовательно, мне нужно использовать регулярные выражения. Я надеюсь, что это лучший пример.

Спасибо, Anirudh

Ответы [ 5 ]

2 голосов
/ 20 января 2009

Во-первых, спасибо за все ответы.

Вот что я попробовал, и это сработало для меня:

Pattern pattern = Pattern.compile("(ab)(?!.*ab)");
Matcher matcher = pattern.matcher("abcabcabcd");
if(matcher.find()) {
  System.out.println(matcher.start() + ", " + matcher.end());
}

Отображается следующее:

6, 8

Итак, обобщение - <reg_ex>(?!.*<reg_ex>) должно решить эту проблему, где '?!' означает, что следующая за ней строка не должна присутствовать после строки, предшествующей '?!'.

Обновление: На этой странице содержится более подробная информация о том, «не следует ли» с использованием регулярных выражений.

2 голосов
/ 20 января 2009

Это даст вам последнюю дату в группе 1 объекта совпадения.

.*(\d{2}/\d{2}/\d{4})
0 голосов
/ 20 января 2009

Для примера с датой вы можете сделать это с помощью Pattern API, а не в самом регулярном выражении. Основная идея состоит в том, чтобы получить все совпадения, а затем вернуть последний.

public static void main(String[] args) {

    // this may be over-kill, you can replace with a much simpler but more lenient version
    final String dateRegex = "\\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\\b";
    final String sample = "12/08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more";

    List<String> allMatches = getAllMatches(dateRegex, sample);
    System.out.println(allMatches.get(allMatches.size() - 1));        
}

private static List<String> getAllMatches(final String regex, final String input) {

    final Matcher matcher = Pattern.compile(regex).matcher(input);
    return new ArrayList<String>() {{
        while (matcher.find())
            add(input.substring(matcher.start(), matcher.end()));
    }};
}
0 голосов
/ 20 января 2009

Я не понимаю, что вы пытаетесь сделать. Почему только последние, если они все одинаковые? Почему регулярное выражение и почему не int pos = s.lastIndexOf (String str)?

0 голосов
/ 20 января 2009
Pattern p = Pattern.compile("ab.*?$");
Matcher m = p.matcher("abcabcabcabc");
boolean b = m.matches();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...