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

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

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

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

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

Спасибо, Анирудх

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
774
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Pattern p = Pattern.compile("ab.*?$");
Matcher m = p.matcher("abcabcabcabc");
boolean b = m.matches();

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

Может быть, потому что ab - всего лишь пример? Это может быть [abc] [abc], который вы ищете. Тогда lastIndexOf () не работает. Конечно, если это действительно простая строка, то действительно ответом будет lastIndexOf ().

PEZ 20.01.2009 18:07

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

.*(\d{2}/\d{2}/\d{4})

Красивое и простое решение. Чтобы изменить это на его новые условия:. * (\ D {2} / \ d {2} / \ d {4})

Gumbo 20.01.2009 19:57
Ответ принят как подходящий

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

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

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

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

В примере с датой вы можете сделать это с помощью 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()));
    }};
}

Да, это тоже работает. Однако я искал что-то, что дало бы мне ответ без моего зацикливания на всех матчах.

Anirudh 20.01.2009 19:02

Другие вопросы по теме