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




Pattern p = Pattern.compile("ab.*?$");
Matcher m = p.matcher("abcabcabcabc");
boolean b = m.matches();
Я не понимаю, что вы пытаетесь сделать. Почему только последние, если они все одинаковые? Почему регулярное выражение и почему не int pos = s.lastIndexOf (String str)?
Это даст вам последнюю дату в группе 1 объекта соответствия.
.*(\d{2}/\d{2}/\d{4})
Красивое и простое решение. Чтобы изменить это на его новые условия:. * (\ D {2} / \ d {2} / \ d {4})
Во-первых, спасибо за все ответы.
Вот что я пробовал, и это сработало для меня:
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()));
}};
}
Да, это тоже работает. Однако я искал что-то, что дало бы мне ответ без моего зацикливания на всех матчах.
Может быть, потому что ab - всего лишь пример? Это может быть [abc] [abc], который вы ищете. Тогда lastIndexOf () не работает. Конечно, если это действительно простая строка, то действительно ответом будет lastIndexOf ().