我有一个看似简单的问题,虽然我无法理解它。
假设我有以下字符串:'abcabcabcabc',我想得到'ab'的最后一次出现。有没有办法可以做到这一点没有从字符串的开头循环遍历所有其他'ab'?
我读到了锚定字符串结尾然后使用所需的正则表达式解析字符串。我不确定如何在Java中执行此操作(是否支持?)。
更新:我想我已经对我的(简化)简化示例造成了很多困惑。让我尝试另一个。比如,我有一个字符串 - '12 / 08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more'。在这里,我想要最后日期,因此我需要使用正则表达式。我希望这是一个更好的例子。
谢谢, Anirudh
答案 0 :(得分:2)
这将为您提供匹配对象的第1组中的最后一个日期。
.*(\d{2}/\d{2}/\d{4})
答案 1 :(得分:2)
首先,感谢所有答案。
这是我尝试过的,这对我有用:
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>)
应该解决这个问题'?!'表示在'?!'之前的字符串后面不应出现后面的字符串。
更新: This page提供了有关使用正则表达式“未遵循”的更多信息。
答案 2 :(得分:0)
Pattern p = Pattern.compile("ab.*?$");
Matcher m = p.matcher("abcabcabcabc");
boolean b = m.matches();
答案 3 :(得分:0)
我不明白你想做什么。为什么只有最后一个如果它们都一样?为什么正则表达式为什么不是int pos = s.lastIndexOf(String str)?
答案 4 :(得分:0)
对于日期示例,您可以使用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()));
}};
}